1

가장 구조화되지 않은 형식으로 데이터를 공급해야하는 기존 시스템이 있습니다. 다음은 .NET DataContractSerializer에서도 가능합니까?사용자 지정 속성이 추가되지 않은 CollectionDataContract serialization (DataMember)

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

참고 : 이 레거시 시스템이 기대하고 정확하게하는 방법을 다음과 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</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를 변경할 수 있습니까? DataContract Serialization 대신 XML Serialization을 사용할 수 있습니까? – 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> 

을하지만 당신이 가질 수 있습니다 : 그래서 당신이 할 수있는 권한은 없습니다 XmlSerializer를 사용하는 당신이해야합니다 당신의 시나리오에서

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

합니다.

관련 문제