【问题标题】:XmlSerializer errors after updating from .NET 3.5 to .NET 4.6从 .NET 3.5 更新到 .NET 4.6 后出现 XmlSerializer 错误
【发布时间】: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”,并正确反序列化它们。

【问题讨论】:

标签: c# xml serialization xml-serialization


【解决方案1】:

如果您只是想反序列化,那么也许这对您有用:

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;
}

缺点是如果你序列化它,一切都会变成&lt;price1&gt;,不管它是以&lt;price1&gt;还是&lt;price2&gt;开头...但是...我可以'没有办法解决这个问题,因为没有地方可以存储它原来的样子。

【讨论】:

  • 任何需要为不同元素编写单独集合的解决方案的主要问题是我缩短了这个例子。在代码中,这个 List 有 37 个 XmlElement 标记。另外我真的很想知道为什么它在以前的 .NET 版本中有效
  • @WojtekPojda 哎哟......好吧,让我看看替代品......(但是:它有效!)
  • @WojtekPojda 我无法让[XmlChoiceIdentifier] 为这种情况工作;我怀疑您无意中发现了一些可以正常工作的东西,但不是作为受支持的场景;我的建议:使用反射输出 36 * 按照上面的假列表技巧,并将其推到 partial class 某处...
  • 是的,看来这是唯一的解释。不过,我会保持一些希望并等待,也许有人会解释一下。如果不是,我会将您标记为答案,因为在这种情况下它可能是最好的解决方案
猜你喜欢
  • 2023-02-21
  • 2013-03-06
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多