【问题标题】:List<string> -> xml deserializationList<string> -> xml 反序列化
【发布时间】:2017-03-23 07:40:12
【问题描述】:

我有以下 xml 文件:

<ItemList>
    <Item id="item-aa-00" status="TYPE1">
        <Elements>
            <element>element121</element>       
        </Elements>     
    </Item>
    <Item id="item-aa-01" status="TYPE2">
        <Elements>
            <element>element122</element>
            <element>element123</element>
            <element>element124</element>
        </Elements>     
    </Item> 
</ItemList>

我正在尝试使用以下模型对其进行反序列化:

[DataContract]
public enum ItemStatusEnum
{
    [EnumMember(Value = "TYPE1")]
    TYPE1 = 10,
    [EnumMember(Value = "TYPE2")]
    TYPE2 = 20
}

[XmlRoot("Item")]
[DataContract(Name = "Item")]
public class ItemDto
{

    [DataMember(Name = "id")]
    [XmlAttribute(AttributeName = "id")]
    public string Id { get; set; }

    [DataMember(Name = "candidateElements")]
    [XmlIgnore]
    public IEnumerable<string> Elements { get; set; }

    [XmlArray("Elements")]
    [XmlArrayItem("element"), Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public List<string> CandidateElementsSurrogate { get { return Elements .ToList(); } set { Elements = value; } }

    [DataMember(Name = "status")]
    [XmlAttribute(AttributeName = "status")]
    public ItemStatusEnum Status { get; set; }

    public ItemDto()
    {
        this.Elements = new List<string>();
    }

}

[XmlRoot("ItemList")]
[DataContract(Name = "ItemListDto", Namespace = "")]
public class ItemListDto
{

    [XmlElement("Item")]
    [DataMember(Name = "myElements")]
    public List<ItemDto> myElements { get; set; }

}

此模型设法反序列化我的 xml 文件,但 Elements 集合仍然为空。我错过了什么?

【问题讨论】:

  • 如果我掩盖了某些内容,但我没有看到您在列表中添加任何内容,请原谅我。

标签: c# .net xml deserialization xmlserializer


【解决方案1】:

我已经更改了这两个属性,并且可以反序列化您的 xml:

[XmlIgnore]
public List<string> Elements { get; set; }

[XmlArray("Elements")]
[XmlArrayItem("element")]
public List<string> CandidateElementsSurrogate { get { return Elements; } set { Elements = value; } }

我已经删除了DataMember属性,它们不被反序列化使用。

【讨论】:

  • 我使用 CandidateElementsSurrogate 的原因是我需要有 Enumerale Elements { get;放;并且我希望反序列化使用代理来完成它的工作
  • 我明白,在这种情况下,您应该省略 ToList 并将 Property typ 更改为 lost,我更新我的答案
  • 不可能有 IEnumerable 元素 {get;放; } ?即使使用 List Elements 我也有一个空的“Elements”列表
  • 你需要 List 来反序列化它。如果你留下一个属性 IEnumerable 和一个 List,每次调用 ToList() 时都会创建一个新的列表实例,序列化程序会向其中添加新的项目,下一次将使用新的空实例,依此类推
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多