2016-11-22 6 views
0

ライセンスファイルを読み書きするためのテストを作成しました。確かに、これは弱いライセンスですが、私がそれを稼働させることができれば、私たちが必要とするものに対してはうまくいくでしょう。シリアル化が作成されたxmlでエラーを返す非直列化

クラスのシリアル化を行ったこのブログが見つかりました。ファイルに保存できるようになりました。ここで私はからの助けを得ているサイト:だから

http://codehandbook.org/c-object-xml/

は、私は、私のクラスを取ってそれからXMLを作成し、それを暗号化し、それをファイルに保存しています。この部分はうまくいくようです。それが作成されます

私のxmlは:

<?xml version=\"1.0\" encoding=\"utf-16\"?> 
<ArrayOfCheckObject xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"> 

    <CheckObject> 
     <Program>Software1</Program> 
     <CompanyCode>1234</CompanyCode> 
     <WorkstationId>AA</WorkstationId> 
     <HardwareId>askldasldfj123234</HardwareId> 
    </CheckObject> 

    <CheckObject> 
     <Program>Software2</Program> 
     <CompanyCode>23456</CompanyCode> 
     <WorkstationId>BB</WorkstationId> 
     <HardwareId>askldwwwwwwwwwww</HardwareId> 
    </CheckObject> 

    <CheckObject> 
     <Program>Software3</Program> 
     <CompanyCode>4567</CompanyCode> 
     <WorkstationId>CC</WorkstationId> 
     <HardwareId>qqqqqqqq123234</HardwareId> 
    </CheckObject> 

</ArrayOfCheckObject> 

私は読みやすさのためにそれをフォーマットされています。

私がテストしていた次のステップは、ファイルから読み込み、解読してxmlを自分のクラスに変換することでした。私のクラスへの変換は、エラーがこの行ではどこから来ているように思わ:

obj = serializer.Deserialize(xmlReader); // <--- error occurs here!! 

マイエラー:

{System.InvalidOperationException: There is an error in XML document (1, 41). ---> System.InvalidOperationException: <ArrayOfCheckObject xmlns=''> was not expected. 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderCheckObject.Read3_CheckObject() 
    --- End of inner exception stack trace --- 
    at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) 
    at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader) 
    at ObjectCheck.XmlHelper.ObjectToXml(String xml, Type objectType) in c:\tgsource\Suburban Projects\ObjectCheck\ObjectCheck\XmlHelper.cs:line 46} 

これはXmlHelperクラスです:

using System; 
using System.IO; 
using System.Xml; 
using System.Xml.Serialization; 

namespace ObjectCheck 
{ 
    internal static class XmlHelper 
    { 
    public static string GetXmlFromObject(object o) 
    { 
     StringWriter sw = new StringWriter(); 
     XmlTextWriter tw = null; 
     try 
     { 
     XmlSerializer serializer = new XmlSerializer(o.GetType()); 
     tw = new XmlTextWriter(sw); 
     serializer.Serialize(tw, o); 
     } 
     catch (Exception ex) 
     { 
     throw; 
     } 
     finally 
     { 
     sw.Close(); 
     if (tw != null) 
     { 
      tw.Close(); 
     } 
     } 
     return sw.ToString(); 
    } 

    public static Object ObjectToXml(string xml, Type objectType) 
    { 
     StringReader strReader = null; 
     XmlSerializer serializer = null; 
     XmlTextReader xmlReader = null; 
     Object obj = null; 
     try 
     { 
     strReader = new StringReader(xml); 
     serializer = new XmlSerializer(objectType); 
     xmlReader = new XmlTextReader(strReader); 
     obj = serializer.Deserialize(xmlReader); // <--- error occurs here!! 

     } 
     catch (Exception ex) 
     { 
     //Handle Exception Code 
     } 
     finally 
     { 
     if (xmlReader != null) 
     { 
      xmlReader.Close(); 
     } 
     if (strReader != null) 
     { 
      strReader.Close(); 
     } 
     } 
     return obj; 
    } 

    } 
} 

マイEncryptionHelperクラス:

using System; 
using System.IO; 
using System.Security.Cryptography; 
using System.Text; 

namespace ObjectCheck 
{ 
    internal static class EncryptionHelper 
    { 

    public static string Encrypt(string clearText) 
    { 
     string EncryptionKey = "12345"; 
     byte[] clearBytes = Encoding.Unicode.GetBytes(clearText); 
     using (Aes encryptor = Aes.Create()) 
     { 
     Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); 
     encryptor.Key = pdb.GetBytes(32); 
     encryptor.IV = pdb.GetBytes(16); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write)) 
      { 
      cs.Write(clearBytes, 0, clearBytes.Length); 
      cs.Close(); 
      } 
      clearText = Convert.ToBase64String(ms.ToArray()); 
     } 
     } 
     return clearText; 
    } 
    public static string Decrypt(string cipherText) 
    { 
     string EncryptionKey = "12345"; 
     cipherText = cipherText.Replace(" ", "+"); 
     byte[] cipherBytes = Convert.FromBase64String(cipherText); 
     using (Aes encryptor = Aes.Create()) 
     { 
     Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); 
     encryptor.Key = pdb.GetBytes(32); 
     encryptor.IV = pdb.GetBytes(16); 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write)) 
      { 
      cs.Write(cipherBytes, 0, cipherBytes.Length); 
      cs.Close(); 
      } 
      cipherText = Encoding.Unicode.GetString(ms.ToArray()); 
     } 
     } 
     return cipherText; 
    } 


    } 
} 

上記のクラスをテストする私のメインクラス:

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Xml.Serialization; 

namespace ObjectCheck 
{ 
    public class CheckObject 
    { 
    public string Program { set; get; } 
    public string CompanyCode { set; get; } 
    public string WorkstationId { set; get; } 
    public string HardwareId { set; get; } 

    } 

    public static class ObjectCheck 
    { 
    public static Guid Check(CheckObject checkObject) 
    { 
     return CheckValue(checkObject); 
    } 

    private static Guid CheckValue(CheckObject checkObject) 
    { 
     switch (checkObject.Program.ToLower()) 
     { 
     case "software1": 
      SaveObjectCheck(); 
      return CheckPropane(checkObject); 
      break; 

     default: 
      return Guid.NewGuid(); 
      break; 
     } 
    } 

    private static void SaveObjectCheck() 
    { 
     var obj = new List<CheckObject>(); 

     var obj1 = new CheckObject(); 
     obj1.Program = "Software1"; 
     obj1.CompanyCode = "1234"; 
     obj1.HardwareId = "askldasldfj123234"; 
     obj1.WorkstationId = "AA"; 
     obj.Add(obj1); 

     var obj2 = new CheckObject(); 
     obj2.Program = "Software2"; 
     obj2.CompanyCode = "2345"; 
     obj2.HardwareId = "askldwwwwwwwwwww"; 
     obj2.WorkstationId = "BB"; 
     obj.Add(obj2); 

     var obj3 = new CheckObject(); 
     obj3.Program = "Software3"; 
     obj3.CompanyCode = "3456"; 
     obj3.HardwareId = "qqqqqqqq123234"; 
     obj3.WorkstationId = "CC"; 
     obj.Add(obj3); 

     var xml = XmlHelper.GetXmlFromObject(obj); 
     var encxml = EncryptionHelper.Encrypt(xml); 

     using (var sw = new StreamWriter(@"c:\test\ObjectCheck.dat")) 
     { 
     sw.Write(encxml); 
     } 

    } 

    private static Guid CheckPropane(CheckObject checkObject) 
    { 
     var file = @"c:\test\ObjectCheck.dat"; 
     var readfile = String.Empty; 

     using (var sr = new StreamReader(file)) 
     { 
     var read = sr.ReadToEnd(); 
     readfile = EncryptionHelper.Decrypt(read); 
     } 

     if (string.IsNullOrEmpty(readfile)) 
     { 
     return Guid.Empty; 
     } 

     //byte[] byteArray = Encoding.UTF8.GetBytes(readfile); 
     //byte[] byteArray = Encoding.ASCII.GetBytes(contents); 
     //MemoryStream stream = new MemoryStream(byteArray); 

     CheckObject mco; 
     //using (TextReader reader = new StreamReader(readfile)) 
     //{ 
     // XmlSerializer serializer = new XmlSerializer(typeof(CheckObject)); 
     // mco = (CheckObject)serializer.Deserialize(stream); 
     //} 

     var co = XmlHelper.ObjectToXml(readfile, typeof(CheckObject)); 
     return Guid.Empty; 

    } 

    } 

} 

何か提案がありますか?

答えて

1

あなたはそれを間違ったタイプに変換しています。それはList<CheckObject>であるあなたが連載同じタイプである必要があります:

var co = XmlHelper.ObjectToXml(readfile, typeof(List<CheckObject>)); 

List<CheckObject>

var obj = new List<CheckObject>(); 
// ... 
var xml = XmlHelper.GetXmlFromObject(obj); 

をシリアル化CheckObjectとしてデシリアライズ(仕事に行くのではない)

var co = XmlHelper.ObjectToXml(readfile, typeof(CheckObject)); 
+0

あなたの答えを正しいですし、私はそのコードを修正しましたが、あなたの答えを共同でなしに提示するより良い方法がありますndescending。私はそれを見落として、その答えを求めました。 – ErocM

+0

申し訳ありませんが、私はそれを言い直します。 – Xiaoy312

+0

ありがとう、それは完全に働いた。 – ErocM

関連する問題