c# - CollectionDataContract序列化未添加自定义属性(DataMember)

标签 c# serialization datacontractserializer datacontract datamember

我们有一个遗留系统,需要以最非结构化的格式馈送(XML)数据。 .NET DataContractSerializer甚至可能进行以下操作?

鉴于以下DataContracts

[CollectionDataContract(Name = "Options", ItemName = "Option")]
public class OptionItemCollection : List<OptionItem>
{
    [DataMember(Name = "Name")]
    public string Name { get; set; }

    public OptionItemCollection()
    {
    }

    public OptionItemCollection(IEnumerable<OptionItem> items) : base(items)
    {
    }
}

[DataContract(Name = "Option")]
public class OptionItem
{
    [DataMember]
    public string Text { get; set; }
    [DataMember]
    public string Value { get; set; }

}


是否可以将此集合直接序列化为以下XML表示形式:

<Options>
    <Name>Juices</Name>
    <Option Value="1">Orange Juice</Option>
    <Option Value="2">Pineapple</Option>
    <Option Value="3">Fruit Punch</Option>
</Options>


注意:
这正是传统系统期望数据提交的方式。

甚至:

<Options>
    <Name>Juices</Name>
    <Option><Value>1</Value><Text>Orange Juice</Text></Option>
    <Option><Value>2</Value><Text>Pineapple</Text></Option>
    <Option><Value>3</Value><Text>Fruit Punch</Text></Option>
</Options>


还应注意,重点是位于Option元素内的Name和Option元素。

最佳答案

是。尽管DataContractSerializer不显式支持XML属性,但是您可以手动滚动它。尝试这个:

[CollectionDataContract(Name = "Options", ItemName = "Option")]
public class OptionItemCollection : List<OptionItem>
{
    [DataMember(Name = "Name")]
    public string Name { get; set; }

    public OptionItemCollection()
    {
    }

    public OptionItemCollection(IEnumerable<OptionItem> items)
        : base(items)
    {
    }
}

// note, remove attributes
public class OptionItem : IXmlSerializable
{
    public string Text { get; set; }

    public string Value { get; set; }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteAttributeString("Value", Value);
        writer.WriteElementString("Text", Text);
    }

    public void ReadXml(XmlReader reader)
    {
        // implement if necessary
        throw new NotImplementedException();
    }

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        throw new NotImplementedException();
    }
}

关于c# - CollectionDataContract序列化未添加自定义属性(DataMember),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7501526/

相关文章:

c# - 使用 DataContractSerializer 自定义序列化

c# - 异常 : Maximum number of items that can be serialized or deserialized in an object graph is '65536'

c# - 下拉列表格式问题

c# - 相同 LineSeries 的多色标记 - OxyPlot

.net - JSON序列化时如何使用JavaScriptSerializer设置格式?

c# - 在不使用文件系统的情况下在 C# 中进行序列化

c# - 通用类型层次结构的 DataContractSerialization

c# - 将 arraylist 值插入数据库

c# - 如何检测是否从 Unity 安装了 Google Play 服务?

c++ - QFile.write(myStruct)-怎么样?