1

我们有一个遗留系统,需要以非结构化格式提供(XML)数据。 .NET DataContractSerializer以下甚至可能吗?CollectionDataDataContract序列化不添加自定义属性(DataMember)

鉴于以下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> 

还要注意该强调的是名称和居住的选项元素中选项元素。

+0

您是否允许更改DataContracts?您是否允许使用XML序列化而不是DataContract序列化? – mellamokb

+0

是的,我们可以。但我只是想知道[更新和更高级的] DataContractSerializer是否可行 – Tawani

回答

3

是的。尽管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(); 
    } 
} 
3

不,这不可能与DataContractSerializer(DCS)。 DCS不允许展开收集元素。所以你不能有这样的:

<a> 
    <b/> 
    <b/> 
    <b/> 
    <c/> 
</a> 

但你可以有这样的:

<a> 
    <bb> 
    <b/> 
    <b/> 
    <b/> 
    </bb> 
    <c/> 
</a> 

在您的情况,您需要使用XmlSerializer