繁体   English   中英

C#XML序列化可观察集合

[英]C# XML Serialization Observable Collection

我正在尝试反序列化由旧版本代码序列化的一堆数据。 序列化数据时,这些类的结构与当前的类结构不同。 为了使这些数据在我的新代码中正常工作,我不得不在代码中添加旧的类结构,以仅导入此序列化数据。 我将此类称为“ class” _oldVersions。 要反序列化,我使用以下代码:

className_oldVersions temp_className = new className_oldVersions();

XmlSerializer testSerializer = new XmlSerializer(typeof(className_oldVersions), 
   new XmlRootAttribute { ElementName = "className" });

temp_className = (ObservedData_OldVersions)testSerializer.Deserialize(ms_MemoryStream);

这段代码可以正常工作,我可以使用与原始文件不同的类名反序列化数据。 我的问题是,当我尝试使用相同的过程反序列化可观察的集合时。

我创建了一个代码来重现我的问题。 在此代码中,我序列化了一个可观察类的OptimizationVariables集合,并且我想反序列化为可观察类的OptimizationVariablies_NewClass集合,该集合具有与原始类相似的结构。

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

public class OptimizationVariables
{
  public string VariableName { get; set; }    
}

public class OptimizationVariables_NewClass
{
  public string VariableName { get; set; }
}

public class ModelsCollection
{
  private ModelsCollection()
  {
  }    

  private ObservableCollection<OptimizationVariables> m_optimizationVariables =
    new ObservableCollection<OptimizationVariables>();

  public ObservableCollection<OptimizationVariables> OptimizationVariables
  {
    get { return m_optimizationVariables; }
    set { m_optimizationVariables = value; }
  }

  private ObservableCollection<OptimizationVariables_NewClass> m_optimizationVariables_NewClass =
    new ObservableCollection<OptimizationVariables_NewClass>();

  public ObservableCollection<OptimizationVariables_NewClass> OptimizationVariables_NewClass
  {
    get { return m_optimizationVariables_NewClass; }
    set { m_optimizationVariables_NewClass = value; }
  }


}
class Program
{   

  static void Main(string[] args)
  {
    //Here I serialize an ObservableCollection of 2 OptimizationVariables instances
    Serialize();

    //Here I deserialize for the same class and works fine
    Deserialize();

    //Here I try to deserialize to a new class with same structure, but different name. I a have an error.
    Deserialize2NewClass();
  }


  static void Serialize()
  {
    MemoryStream ms;

    ObservableCollection<OptimizationVariables> OptimizationVariables2Serialize = new ObservableCollection<OptimizationVariables>();

    OptimizationVariables opt_var1 = new OptimizationVariables();
    opt_var1.VariableName = "Variable Name 1";
    OptimizationVariables2Serialize.Add(opt_var1);

    OptimizationVariables opt_var2 = new OptimizationVariables();
    opt_var1.VariableName = "Variable Name 2";
    OptimizationVariables2Serialize.Add(opt_var1);

    ms = new MemoryStream();
    XmlSerializer serializer = new XmlSerializer(typeof(ObservableCollection<OptimizationVariables>));
    serializer.Serialize(ms, OptimizationVariables2Serialize);

    TextWriter sw = new StreamWriter("XML_File_x64.bin");
    sw.WriteLine(Convert.ToBase64String(ms.ToArray()));
    sw.Close();
  }

  static void Deserialize()
  {
    byte[] memoryData;
    MemoryStream ms;

    TextReader sw = new StreamReader("XML_File_x64.bin");
    memoryData = Convert.FromBase64String(sw.ReadLine());
    ms = new MemoryStream(memoryData);

    ObservableCollection<OptimizationVariables> OptimizationVariablesDeserialized = new ObservableCollection<OptimizationVariables>();

    XmlSerializer deserializer = new XmlSerializer(typeof(ObservableCollection<OptimizationVariables>));
    OptimizationVariablesDeserialized = (ObservableCollection<OptimizationVariables>)deserializer.Deserialize(ms);

    Console.Write(OptimizationVariablesDeserialized.Count());
    sw.Close();
  }

  static void Deserialize2NewClass()
  {
    byte[] memoryData;
    MemoryStream ms;

    TextReader sw = new StreamReader("XML_File_x64.bin");
    memoryData = Convert.FromBase64String(sw.ReadLine());
    ms = new MemoryStream(memoryData);

    ObservableCollection<OptimizationVariables_NewClass> OptimizationVariablesDeserialized = new ObservableCollection<OptimizationVariables_NewClass>();

    XmlSerializer deserializer = new XmlSerializer(typeof(ObservableCollection<OptimizationVariables_NewClass>));
    OptimizationVariablesDeserialized = (ObservableCollection<OptimizationVariables_NewClass>)deserializer.Deserialize(ms);

    Console.Write(OptimizationVariablesDeserialized.Count());
    sw.Close();
  }

}

您的代码中的问题是序列化时,类OptimizationVariables名称保存在xml数据中。 但是对于反序列化,它需要一个不在XML文件中的OptimizationVariables_NewClass名称。

  • 考虑以下事实:序列化类或结构时不仅会使用变量名,还会使用类名...

因此,只需更改代码以使其将数据保存在可读的xml文件中,然后将“ OptimizationVariables”替换为“ OptimizationVariables_NewClass”即可解决该错误:

using System;
using System.Linq;
using System.IO;
using System.Xml.Serialization;
using System.Collections.ObjectModel;

public class OptimizationVariables
{
    public string VariableName { get; set; }
}

public class OptimizationVariables_NewClass
{
    public string VariableName { get; set; }
}

public class ModelsCollection
{
private ModelsCollection()
{
}

private ObservableCollection<OptimizationVariables> m_optimizationVariables =
  new ObservableCollection<OptimizationVariables>();

public ObservableCollection<OptimizationVariables> OptimizationVariables
{
    get { return m_optimizationVariables; }
    set { m_optimizationVariables = value; }
}

private ObservableCollection<OptimizationVariables_NewClass> m_optimizationVariables_NewClass =
  new ObservableCollection<OptimizationVariables_NewClass>();

public ObservableCollection<OptimizationVariables_NewClass> OptimizationVariables_NewClass
{
    get { return m_optimizationVariables_NewClass; }
    set { m_optimizationVariables_NewClass = value; }
}


}
class Program
{

static void Main(string[] args)
{
    Serialize();
    Deserialize();
    Deserialize2NewClass();
}

static void Serialize()
{
    ObservableCollection<OptimizationVariables> OptimizationVariables2Serialize = new ObservableCollection<OptimizationVariables>();

    OptimizationVariables opt_var1 = new OptimizationVariables();
    opt_var1.VariableName = "Variable Name 1";
    OptimizationVariables2Serialize.Add(opt_var1);

    OptimizationVariables opt_var2 = new OptimizationVariables();
    opt_var1.VariableName = "Variable Name 2";
    OptimizationVariables2Serialize.Add(opt_var1);

    TextWriter writer = new StreamWriter("XML_File.xml");
    XmlSerializer serializer = new XmlSerializer(typeof(ObservableCollection<OptimizationVariables>));
    serializer.Serialize(writer, OptimizationVariables2Serialize);
    writer.Close();
}

static void Deserialize()
{
    TextReader sw = new StreamReader("XML_File.xml");

    ObservableCollection<OptimizationVariables> OptimizationVariablesDeserialized = new ObservableCollection<OptimizationVariables>();

    XmlSerializer deserializer = new XmlSerializer(typeof(ObservableCollection<OptimizationVariables>));
    OptimizationVariablesDeserialized = (ObservableCollection<OptimizationVariables>)deserializer.Deserialize(sw);

    Console.Write(OptimizationVariablesDeserialized.Count());
    sw.Close();
}

static void Deserialize2NewClass()
{
    TextReader sw = new StreamReader("XML_File.xml");
    var str = sw.ReadToEnd();
    sw.Close();
    str = str.Replace("OptimizationVariables", "OptimizationVariables_NewClass");
    var stream = new StringReader(str);
    ObservableCollection<OptimizationVariables_NewClass> OptimizationVariablesDeserialized = new ObservableCollection<OptimizationVariables_NewClass>();

    XmlSerializer deserializer = new XmlSerializer(typeof(ObservableCollection<OptimizationVariables_NewClass>));
    OptimizationVariablesDeserialized = (ObservableCollection<OptimizationVariables_NewClass>)deserializer.Deserialize(stream);

    Console.Write(OptimizationVariablesDeserialized.Count());
}

}

现在工作正常!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM