Сериализация CollectionDataContract без добавления пользовательских свойств (DataMember) - PullRequest
1 голос
/ 21 сентября 2011

У нас есть устаревшая система, которая должна передавать (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>

Также обратите внимание , что акцент делается на элемент Name и Option , находящийся в элементе Options .

Ответы [ 2 ]

4 голосов
/ 30 сентября 2011

Нет, это невозможно с DataContractSerializer (DCS).DCS не позволяет развернутые элементы коллекции.Таким образом, у вас не может быть этого:

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

Но вы можете иметь это:

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

В вашем сценарии вам нужно будет использовать XmlSerializer.

4 голосов
/ 21 сентября 2011

Да. Хотя 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();
    }
}
...