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