Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#XML序列化可观察集合_C#_Xml_Serialization - Fatal编程技术网

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名称

  • 请考虑这样一个事实,序列化类或结构时不仅要使用变量名,还要使用类名
因此,只需更改代码,使其将数据保存在可读的xml文件中,然后将“OptimizationVariables”替换为“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”;
优化