C#XML序列化可观察集合
我正在尝试反序列化一组由旧版本代码序列化的数据。序列化数据时,类的结构与当前的类结构不同。为了在我的新代码中保持此数据的工作状态,我需要将旧的类结构添加到代码中,以便导入此序列化数据。我把这些课程称为“课堂”旧版本。要反序列化,我使用以下代码:C#XML序列化可观察集合,c#,xml,serialization,C#,Xml,Serialization,我正在尝试反序列化一组由旧版本代码序列化的数据。序列化数据时,类的结构与当前的类结构不同。为了在我的新代码中保持此数据的工作状态,我需要将旧的类结构添加到代码中,以便导入此序列化数据。我把这些课程称为“课堂”旧版本。要反序列化,我使用以下代码: className_oldVersions temp_className = new className_oldVersions(); XmlSerializer testSerializer = new XmlSerializer(typeof(cl
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);
这段代码运行良好,我可以使用不同于原始类名的类名反序列化数据。我的问题是,当我尝试使用相同的过程来反序列化一个可观察的集合时
我创建了一个代码来重现我的问题。在这段代码中,我序列化了一个可观察的类优化变量集合,我想反序列化为一个可观察的类优化变量集合\u 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();
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
使用System.Threading.Tasks;
使用System.Xml.Serialization;
使用System.Collections.ObjectModel;
公共类优化变量
{
公共字符串变量名{get;set;}
}
公共类优化变量\u NewClass
{
公共字符串变量名{get;set;}
}
公共类模型集合
{
私有模型集合()
{
}
私有ObservableCollection m_优化变量=
新的可观察集合();
公共可观测集合优化变量
{
获取{返回m_optimizationVariables;}
设置{m_optimizationVariables=value;}
}
私有ObservableCollection m_optimizationVariables_NewClass=
新的可观察集合();
公共ObservableCollection优化变量\u NewClass
{
获取{return m_optimizationVariables_NewClass;}
设置{m_optimizationVariables_NewClass=value;}
}
}
班级计划
{
静态void Main(字符串[]参数)
{
//这里我序列化了2个OptimizationVariables实例的ObservableCollection
序列化();
//在这里,我为同一个类反序列化,效果很好
反序列化();
//在这里,我尝试反序列化到一个具有相同结构但名称不同的新类。我有一个错误。
反序列化2新类();
}
静态void序列化()
{
记忆流质谱;
ObservableCollection OptimizationVariables2Serialize=新的ObservableCollection();
OptimizationVariables opt_var1=新的OptimizationVariables();
opt_var1.VariableName=“变量名1”;
OptimizationVariables2Serialize.Add(opt_var1);
OptimizationVariables opt_var2=新的OptimizationVariables();
opt_var1.VariableName=“变量名2”;
OptimizationVariables2Serialize.Add(opt_var1);
ms=新内存流();
XmlSerializer serializer=新的XmlSerializer(typeof(observeCollection));
serializer.Serialize(ms,OptimizationVariables2Serialize);
TextWriter sw=新的StreamWriter(“XML_文件_x64.bin”);
sw.WriteLine(Convert.tobase64字符串(ms.ToArray());
sw.Close();
}
静态void反序列化()
{
字节[]内存数据;
记忆流质谱;
TextReader sw=新的StreamReader(“XML_文件_x64.bin”);
memoryData=Convert.FromBase64String(sw.ReadLine());
ms=新的内存流(memoryData);
ObservableCollection OptimizationVariablesDeserialized=新的ObservableCollection();
XmlSerializer反序列化器=新的XmlSerializer(typeof(observateCollection));
OptimizationVariablesDeserialized=(ObservableCollection)反序列化程序;
Write(OptimizationVariablesDeserialized.Count());
sw.Close();
}
静态void反序列化2newclass()
{
字节[]内存数据;
记忆流质谱;
TextReader sw=新的StreamReader(“XML_文件_x64.bin”);
memoryData=Convert.FromBase64String(sw.ReadLine());
ms=新的内存流(memoryData);
ObservableCollection OptimizationVariablesDeserialized=新的ObservableCollection();
XmlSerializer反序列化器=新的XmlSerializer(typeof(observateCollection));
OptimizationVariablesDeserialized=(ObservableCollection)反序列化程序;
Write(OptimizationVariablesDeserialized.Count());
sw.Close();
}
}
代码中的问题是,序列化时,类OptimizationVariables名称保存在xml数据中。但是对于反序列化,它需要一个不在xml文件中的OptimizationVariables\u 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());
}
}
使用系统;
使用System.Linq;
使用System.IO;
使用System.Xml.Serialization;
使用System.Collections.ObjectModel;
公共类优化变量
{
公共字符串变量名{get;set;}
}
公共类优化变量\u NewClass
{
公共字符串变量名{get;set;}
}
公共类模型集合
{
私有模型集合()
{
}
私有ObservableCollection m_优化变量=
新的可观察集合();
公共可观测集合优化变量
{
获取{返回m_optimizationVariables;}
设置{m_optimizationVariables=value;}
}
私有ObservableCollection m_optimizationVariables_NewClass=
新的可观察集合();
公共ObservableCollection优化变量\u NewClass
{
获取{return m_optimizationVariables_NewClass;}
设置{m_optimizationVariables_NewClass=value;}
}
}
班级计划
{
静态void Main(字符串[]参数)
{
序列化();
反序列化();
反序列化2新类();
}
静态void序列化()
{
ObservableCollection OptimizationVariables2Serialize=新的ObservableCollection();
OptimizationVariables opt_var1=新的OptimizationVariables();
opt_var1.VariableName=“变量名1”;
优化