2016-11-22 90 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