C# 从.NET 3.5更新到.NET 4.6后的XmlSerializer错误

C# 从.NET 3.5更新到.NET 4.6后的XmlSerializer错误,c#,xml,serialization,xml-serialization,C#,Xml,Serialization,Xml Serialization,因此,我最近将一个项目从.NET3.5更新为.NET4.6,我的XML序列化停止工作。我把它缩小到一个单一的结构,我同意,看起来很奇怪 [XmlElement("price1", typeof(PriceBonusData))] [XmlElement("price2", typeof(PriceBonusData))] public List<PriceBonusData> PriceBonusDataList; Edit2:我在一个空项目上运行了一些进一步的测试,它的.NET3

因此,我最近将一个项目从.NET3.5更新为.NET4.6,我的XML序列化停止工作。我把它缩小到一个单一的结构,我同意,看起来很奇怪

[XmlElement("price1", typeof(PriceBonusData))]
[XmlElement("price2", typeof(PriceBonusData))]
public List<PriceBonusData> PriceBonusDataList;
Edit2:我在一个空项目上运行了一些进一步的测试,它的.NET3.5版本,所以我想我可以分享它工作时的行为

此结构使用最后一个XmlElement(在本例中为“price2”)序列化


在反序列化过程中,两个元素都是有效的。我手动更改了XML文件,使其同时包含“price1”和“price2”,并正确地反序列化它们。

如果您只是尝试反序列化,那么这可能对您有用:

public class Foo
{
    // the "real" list that takes <price1> elements
    [XmlElement("price1", typeof(PriceBonusData))]
    public List<PriceBonusData> PriceBonusDataList {get;} = new List<PriceBonusData>();

    // spoof a second list that handles <price2> elements (actually: the same list)
    [XmlElement("price2", typeof(PriceBonusData))]
    public List<PriceBonusData> PriceBonusDataList2 => PriceBonusDataList;

    // this disables serialization of PriceBonusDataList2 so we don't double up
    public bool ShouldSerializePriceBonusDataList2() => false;
}
公共类Foo
{
//获取元素的“真实”列表
[xmlement(“price1”,typeof(PriceBonusData))]
public List PriceBonusDataList{get;}=new List();
//欺骗处理元素的第二个列表(实际上:相同的列表)
[XmlElement(“price2”,类型(PriceBonuData))]
公共列表PriceBonusDataList 2=>PriceBonusDataList;
//这将禁用PriceBonusDataList2的序列化,因此我们不会重复
public bool应该序列化PriceBonuDatalist2()=>false;
}

缺点是,如果您序列化它,无论它是以
还是
开头,所有内容都将变成
。。。但是我看不出有什么办法可以解决这个问题,因为没有地方可以存储它原来的内容。

在3.5中它会做什么?它将如何在1和2之间进行选择?对于包含
PriceBonusData
的列表,它将序列化什么?a
?两者都有?@GSerg我真的不知道。这是一个我与之无关的遗留代码,我只是进入了这个项目。我甚至不确定它是否是序列化的,现在我正试图用这种结构反序列化xml。我有点惊讶这是否奏效。如果您选择使用
XmlChoiceIdentifier
路径,可以在和中找到一些选项。任何需要为不同元素编写单独集合的解决方案的主要问题是,我缩短了此示例。在代码中,该列表有37个XmlElement标记。另外,我真的很想知道为什么它在以前的.NET中起作用version@WojtekPojda哎哟好的,让我看一下备选方案。。。(但是:它是有效的!)@WojtekPojda我也无法让
[XmlChoiceIdentifier]
在这种情况下工作;我怀疑您无意中进入了某种工作状态,但并不是作为支持场景使用的;我的建议是:使用反射输出36*如上所述的假列表技巧,并将其放入
部分类中
的某个地方……是的,看起来这是唯一的解释。尽管如此,我还是会抱着希望等待,也许会有人来解释。如果不是,我会把你的答案记下来,因为这可能是最好的解决方案
public class Foo
{
    // the "real" list that takes <price1> elements
    [XmlElement("price1", typeof(PriceBonusData))]
    public List<PriceBonusData> PriceBonusDataList {get;} = new List<PriceBonusData>();

    // spoof a second list that handles <price2> elements (actually: the same list)
    [XmlElement("price2", typeof(PriceBonusData))]
    public List<PriceBonusData> PriceBonusDataList2 => PriceBonusDataList;

    // this disables serialization of PriceBonusDataList2 so we don't double up
    public bool ShouldSerializePriceBonusDataList2() => false;
}