Имена пользовательских элементов с использованием DataContractSerializer в списке примитивов - PullRequest
10 голосов
/ 01 апреля 2011

Меня интересует наилучший способ настройки имен пользовательских элементов при использовании Списка примитивов с DataContractSerializer.Допустим, у меня есть следующий класс, который содержит список строк как DataMember.

[DataContract]
public class ClassName
{
    [DataMember]
    public List<String> FieldName { get; set; }
}

По умолчанию это сериализуется в следующем порядке:

<ClassName xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <FieldName xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <a:string>Value 1</a:string>
    <a:string>Value 2</a:string>
    <a:string>Value 3</a:string>
  </FieldName>
</ClassName>

Я хотел бы сделатьXML максимально просто преобразовать через XSLT, поэтому в идеале я бы переименовал теги во что-то более полезное, например, в Value.

Одним из возможных решений является создание класса, расширяющего Collection, и установка ItemName для параметра CollectionDataMember, который я нашел здесь .Мне было интересно, есть ли способ достичь той же цели без необходимости в этом дополнительном классе или другой форме класса-обертки.Сериализатор XML использует параметры XMLArray и XMLArrayItem для достижения этой цели, но DataContractSerializer, похоже, не обладает подобной функциональностью.

Спасибо за любые советы или идеи!

Ответы [ 2 ]

7 голосов
/ 16 апреля 2013

Определите контракт данных для представления списка строк и используйте его в качестве типа для свойства FieldName.Затем вы можете использовать атрибут CollectionDataContract для настройки XML.

[CollectionDataContract(ItemName="Value")]
public class MyList : List<string>  {}

[DataMember]
public MyList FieldName { get; set; }
0 голосов
/ 26 марта 2013

Ваши возможности ограничены. DataContractSerializer не предназначен для создания красивого XML. Он используется WCF, который не является дружественным для человека по своей природе. Поэтому самое большее, что вы можете сделать, - это минимизировать использование пространства имен и элементов имени, определяя пользовательский тип с помощью строкового свойства.

...