Как сериализовать и десериализовать пользовательские списки с помощью protobuf-net - PullRequest
2 голосов
/ 11 июля 2011

У меня есть собственный список, который содержит некоторые атрибуты, необходимые для сериализации, вместе с содержащими его элементами.

Однако, как только я добавляю атрибут ProtoContract в свой пользовательский список, его элементы больше не сериализуются.

Пример:

    [ProtoContract]
    public class MyCollection : List<string> { 

    [ProtoMember(1)]
    public string MyAdditionalField;
   }

Разве это не должно работать из коробки?

Единственный возможный обходной путь, о котором я могу подумать, это использование суррогата для пользовательского списка, который содержит отдельный список, который затем содержит все данные. Тем не менее, мы имеем дело с большим количеством пользовательских списков ... так что это был бы неэффективный подход.

Спасибо, TH

1 Ответ

1 голос
/ 11 июля 2011

Как и в случае XmlSerializer и TypeDescriptor (и, возможно, DataContractSerializer - я не проверял), между есть список против и список.Если что-то является списком, оно не имеет значений само по себе.

Предпочтительным макетом будет или со списком или значений.

На уровне протокола просто невозможно представить это, поскольку это просто repeated string {name} = {field} - просто некуда идти MyAdditionalField.

(обновление);проверено, и действительно XmlSerializer ведет себя так же:

<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="
http://www.w3.org/2001/XMLSchema">
  <string>abc</string>
  <string>def</string>
</ArrayOfString>

DataContractSerializer ненавидел его больше, выбрасывая:

Тип 'MyCollection' является недопустимым типом коллекции, поскольку он имеетАтрибут DataContractAttribute.

...