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