反序列化在序列化创建的 xml 上给出错误

Deserialize giving an error on xml that serialization created

我创建了一个读取和写入许可证文件的测试。诚然,这是一个弱许可,但如果我能让它工作,它将满足我们的需要。

我发现这个博客有一个 class 的序列化,所以我可以将它保存到一个文件中。这是我从中获得帮助的网站:

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

所以,我正在使用我的 class,从中创建 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 转换为我的 class。转换为我的 class 似乎是此行错误的来源:

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 class:

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;
    }

  }
}

我的加密助手class:

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;
    }


  }
}

我主要class测试以上classes:

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;

    }

  }

}

有什么建议吗?

您将其反序列化为错误的类型。它必须与您序列化的类型相同,即 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));