如何正确更新自定义可序列化类

本文关键字:序列化 自定义 何正确 更新 | 更新日期: 2023-09-27 18:06:35

我正在为一个已经发布的应用程序的更新工作,该应用程序将一些数据序列化到xml文件中,但现在我们必须更新序列化的类(将属性更改为T的列表而不仅仅是T),但我希望仍然能够读取旧文件,像这样:

public class Person 
{
    public int Age{ get; set;}
    public string Name{ get; set;}
    //public string Nickname { get; set; }
    public List<string> Nickname { get; set; }
}
void Main()
{
     XmlSerializer serializer = new XmlSerializer(typeof(Person));

//   var p = new Person() { Age = 5, Name = "Jack", Nickname = "Thunder"};
//   
//   using (StreamWriter s = new StreamWriter("Test.txt"))
//      serializer.Serialize(s,p);
     using (StreamReader s = new StreamReader("Test.txt"))
        serializer.Deserialize(s).Dump(); 
}

我真的不知道如何将旧的字符串昵称属性附加到更新后的昵称属性

你会如何处理这个问题?

如何正确更新自定义可序列化类

您可以通过向Nickname属性添加属性[XmlElement]来使旧的XML自动与新类兼容:

[XmlElement]
public List<string> Nickname { get; set; }

添加此属性表明Nickname属性应该序列化为没有外部包装元素的元素序列。例如以下Person:

var person = new Person
{
    Age = 21,
    Name = "Richard",
    Nickname = new List<string>()
    {
        "Rick", 
        "Ricky",
        "Dick",
    },
};

将按如下顺序序列化:

<Person>
  <Age>21</Age>
  <Name>Richard</Name>
  <Nickname>Rick</Nickname>
  <Nickname>Ricky</Nickname>
  <Nickname>Dick</Nickname>
</Person>

由于旧XML的结构相同,但不超过一个<Nickname>元素,因此在反序列化期间遇到该元素的值时,该元素的值将作为单个条目添加到列表中。

样本小提琴。

您还可以将属性的名称更改为Nicknames,并使用[XmlElement("Nickname")]指定用于序列化的旧名称:

[XmlElement("Nickname")]
public List<string> Nicknames { get; set; }

更多信息请参见控制XML序列化的属性。