protobuf-net и производные от общих коллекций - PullRequest
2 голосов
/ 06 августа 2010

У меня проблемы с выяснением, как заставить protobuf-net сериализовать объект, производный от List . Я попытался добавить атрибут ProtoInclude, но я получаю ProtoBuf.ProtoException: список известных типов`1 для ProtoIncludeAttribute должен быть прямым подклассом UserTypeCollection . Когда я удаляю атрибут ProtoInclude, кажется, что данные вообще не сериализуются. Я не могу найти какие-либо примеры этой ситуации нигде. Я добавляю сериализацию protobuf в качестве опции для нашего API WS и должен поддерживать совместимость с DataContractSerializer.

[CollectionDataContract(), ProtoContract(InferTagFromName = true)]
[ProtoInclude(100, typeof(List<UserType>))]
public class UserTypeCollection : List<UserType>
{ ... }

[DataContract(), ProtoContract(InferTagFromName = true)]
public class UserType { ... }

1 Ответ

3 голосов
/ 07 августа 2010

ProtoInclude используется для обозначения под типов, а не базовых типов (в конце концов, базовый тип уже известен).Кроме того, IList<T> обработка должна в значительной степени быть неявной;обратите внимание, что "вывод ..." и т. д. в случае списков делают очень мало, поскольку списки представляют собой просто последовательность содержащихся элементов.

Для следующего я предполагаючто вы пытаетесь сериализовать список (как самый верхний объект):

Я сейчас не на той машине, но в выпущенных dll я бы ожидайте , что обертывание списка с помощью объекта заставит его работать:

[DataContract]
public class Foo {
    private readonly UserTypeCollection items = new UserTypeCollection();
    [DataMember(Order=1)]
    public UserTypeCollection Items {get{return items;}}
}

В «v2» я бы надеялся, что этот сценарий работает с самого начала.Я попытаюсь проверить это завтра (когда у меня будет подходящая машина).

Еще одна мысль;Подклассы List<T> обычно не очень полезны, поскольку ни один из методов не является виртуальным.Конечно, до вас.И последнее замечание - в «v2» мы можем описать модель внешне, если вы хотите иметь больше контроля над сериализацией, но без влияния на сами типы.

...