Сериализация дополнительных полей с помощью CollectionDataContactAttribute

У меня есть класс, который наследуется от коллекции, в частности List‹>, и я перечислил класс ниже. Проблема, с которой я сталкиваюсь при сериализации объекта в XML с помощью DataContractSerializer, заключается в том, что дополнительные поля, которые я добавил в объект, не сериализуются сериализатором.
Вот класс:


[CollectionDataContract(Name = "ServiceEvents", Namespace = "")]
public class ServiceEventList : List<ServiceEvent> 
{
  [DataMember]
  public long StaleDate { get; set; }

  [DataMember]
  public long ExpirationDate { get; set; }
}

Когда я сериализую объект и записываю на диск, вот результат (обратите внимание, что обе даты StaleDate и ExpirationDate отсутствуют).


<ServiceEvents xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><ServiceEvent><Date>2012-06-26T22:23:24.120817Z</Date><Description>A Service Event</Description><Id>634763462041210040</Id><Notes></Notes><Odometer>42</Odometer></ServiceEvent></ServiceEvents>

Вот код, который сериализует объект:

using (FileStream fs = new FileStream(path, FileMode.Create))
{
  //TODO: StaleDate is not serializing to disk
  //TODO: ExpirationDate is not serializing to disk
  DataContractSerializer ser = new DataContractSerializer(typeof(ServiceEventList));
  ser.WriteObject(fs, list);
}

Моя следующая мысль — удалить структуру наследования и просто встроить объект List в класс. Я бы предпочел просто расширить список, но не буду тратить на это больше времени, если сообщество подтвердит, что мой подход не работает. Заранее спасибо за совет.


person benhorgen    schedule 26.06.2012    source источник


Ответы (1)


Согласно этому сообщению:

http://social.msdn.microsoft.com/Forums/eu/wcf/thread/57eb195a-43a9-47fe-8b1a-a9d23feb2df2

проблема действительно в том, что вы наследуете тип коллекции - в этом случае DataContractSerializer сериализует только свои элементы, но не какие-либо дополнительные свойства.

person metalheart    schedule 23.11.2012
comment
Согласовано; спасибо за ссылку на другую тему. Их объяснение того, как WCF рассматривает Collection‹T› как проводник, эквивалентный T[], помогло подавить мое любопытство. Я верну свою реализацию, чтобы просто включить коллекцию List‹T› как свойство внутри класса, а не наследовать от List‹T›. - person benhorgen; 30.11.2012