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

时间:2014-06-03 19:07:38

标签: c# serialization

我正在努力更新已发布的应用程序,将一些数据序列化为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属性附加到更新的Nickname属性,

你会如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

通过将属性[XmlElement]添加到Nickname属性,您可以使旧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>元素,因此在反序列化期间遇到该元素的值将作为其单个条目添加到列表中。

示例fiddle

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

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

有关详情,请参阅Attributes That Control XML Serialization