1)我有一个使用System.Xml.Serialization attributes的模型类:
[Serializable]
[XmlRoot("foo")]
public class FooModel
{
[XmlText]
public string Name { get; set; }
}
相应的XML标记为:
<foo>
Name
</foo>
2)现在,我想对标记结构进行半兼容的更改,因为名称应该是一个属性,而不是文本内容在节点中:
[Serializable]
[XmlRoot("foo")]
public class FooModel
{
[XmlAttribute("name")]
public string Name { get; set; }
}
标记:
<foo name="Name">
在不退让类实现IXmlSerializable
接口的全有或全无的方法的情况下,我的程序如何与这两个版本向后兼容?该类包含在树结构中,而不是直接序列化,而是由序列化系统隐式序列化。上面,我使用了 semi-compatible 一词,因为XML标记本身支持此更改,但据我所知和研究,C#属性系统不支持。
我曾尝试实施Serialization Binder所建议的Microsoft's Version Tolerant XML Serialization Guide,以便授权内置序列化引擎在遇到Foo
的反序列化时强制转换Bar
,但它似乎与BinaryFormatter
(IFormatter
)紧密相连,这很不方便,因为我希望生成的XML保持人类可读性,并且它与XmlSerializer接口也不兼容我正在使用。
Microsoft指南似乎只处理对架构的更改,该更改构成了从模型中添加和删除字段的方式,这正是我所做的更改,但是除以下内容外,我看不到一种结构化方式(非常难看)使用后备字段的解决方案:
[Serializable]
[XmlRoot("foo")]
public class FooModel
{
private string name;
[XmlAttribute("name")]
public string Name
{
get => name;
set => name = value.Trim();
}
[XmlText]
public string LegacyName
{
get => null; // To prevent automatic serialization as text node
set => name = value.Trim();
}
}
令我惊讶的是,我的在线搜索在使用多个类作为同一事物的版本这一主题上几乎吐出了零结果,因此也许有人曾经这样做过,或者知道一种更优雅的方法来实现相同的目的结果。