【发布时间】:2019-02-11 13:41:28
【问题描述】:
所以我最近将一个项目从 .NET 3.5 更新到 .NET 4.6,我的 XML 序列化停止工作。我把它缩小到一个单一的结构,我同意,它看起来很奇怪。
[XmlElement("price1", typeof(PriceBonusData))]
[XmlElement("price2", typeof(PriceBonusData))]
public List<PriceBonusData> PriceBonusDataList;
报错说我需要给这个字段添加XmlChoiceIdentifier属性,但是不管怎么添加,还是不行。奇怪的是它确实可以在 .NET 3.5 上运行,那么为什么突然需要新属性呢?
编辑:这是我使用 XmlChoiceIdentifier 的尝试。我在文档和 SO 中都看到了类似的解决方案,但它似乎对我不起作用。
[XmlElement(IsNullable = false)]
[XmlIgnore]
public ItemChoiceType[] ItemTypeArray = (ItemChoiceType[])Enum.GetValues(typeof(ItemChoiceType));
[XmlChoiceIdentifier("ItemTypeArray")]
[XmlElement("price1", typeof(PriceBonusData))]
[XmlElement("price2", typeof(PriceBonusData))]
public List<PriceBonusData> PriceBonusDataList;
[XmlType(IncludeInSchema = false)]
public enum ItemChoiceType
{
[XmlEnum("price1")]
price1,
[XmlEnum("price2")]
price2
}
Edit2:我在一个 .NET 3.5 版本的空项目上运行了一些进一步的测试,所以我想我可以分享它在工作时的行为方式。
此结构使用最后一个 XmlElement(在本例中为“price2”)进行序列化。
在反序列化期间,两个元素都有效。我手动更改了 XML 文件,使其同时包含“price1”和“price2”,并正确反序列化它们。
【问题讨论】:
-
在 3.5 中会做什么?它会在 1 和 2 之间如何选择?
-
对于包含
PriceBonusData的列表,它会序列化什么?<price1>,<price2>?两者都有? -
@GSerg 我实际上不知道。这是一个与我无关的遗留代码,我只是进入这个项目。我什至不确定它是否被序列化,现在我正在尝试用这种结构反序列化 xml。
-
这让我有点惊讶。如果您确实选择走
XmlChoiceIdentifier路线,可以在Xml Deserialization - Merging two elements into a singleList<T>object 和XML Serialization error - Invalid or missing value of the choice identifier'ItemsElementName'of type'ItemsChoiceType[]'中找到一些选项。
标签: c# xml serialization xml-serialization