1

ほとんど構造化されていない形式で (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>

また、 Options要素内にあるName要素とOption要素に重点が置かれていることにも注意してください。

4

2 に答える 2

4

いいえ、DataContractSerializer(DCS)ではできません。DCS はラップされていないコレクション要素を許可しません。したがって、これを持つことはできません:

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

しかし、あなたはこれを持つことができます:

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

あなたのシナリオでは、XmlSerializer.

于 2011-09-30T03:59:11.027 に答える
4

はい。は XML 属性を明示的にサポートしてDataContractSerializerいませんが、手動でロールすることができます。これを試して:

[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();
    }
}
于 2011-09-21T15:36:13.947 に答える