c# XML序列化Observable集合

本文关键字:集合 Observable 序列化 XML | 更新日期: 2023-09-27 18:13:40

我正试图反序列化一堆由旧版本的代码序列化的数据。当数据被序列化时,类具有与当前类结构不同的结构。为了让这个数据在我的新代码中工作,我不得不将旧的类结构添加到代码中,以便导入这个序列化的数据。我把这个类称为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();
  }
}

c# XML序列化Observable集合

代码中的问题是,在序列化时,类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());
}
}

现在可以正常工作了!