Сериализуйте класс, имеющий член типа интерфейса, используя protobuf-net

Я не могу сериализовать свой класс с помощью protobuf-net, похоже, проблема в том, что protobuf-net не может сериализовать интерфейс.

interface MyInterface
{
    string name;
}

[ProtoContract]
[ProtoInclude(1, typeof(MyClass1))]
[ProtoInclude(2, typeof(MyClass2))]
public abstract class ParentClass
{
    [ProtoMember(1)]
    List<MyInterface> elements;
}


[ProtoContract]
public class MyClass1 : ParentClass, MyInterface
{
    [ProtoMember(1)]
    int x;
}

[ProtoContract]
public class MyClass2 : MyInterface
{
    [ProtoMember(1)]
    string y;
}

Я не могу сериализовать какой-либо объект типа MyClass1, так как элементы представляют собой список интерфейсов, который может быть Mylass1 или MyClass2. Я получаю некоторую кодировку, не установленную ошибку.

Может ли кто-нибудь сообщить мне, как я могу решить эту проблему. Спасибо.


person ace    schedule 23.09.2010    source источник
comment
(теперь это поддерживается в v2)   -  person Marc Gravell    schedule 25.05.2011


Ответы (2)


В текущих официальных версиях я не включаю поддержку сериализации интерфейса. Тем не менее, у меня есть патч (от другого пользователя), который, похоже, позволяет это сделать.

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

В качестве альтернативы: используйте базовый класс вместо интерфейса. Это поддерживается (через [ProtoInclude]), однако тот факт, что у вашего MyClass1 уже есть родительский класс, несколько усложняет ситуацию.


Изменить: теперь это поддерживается в v2. Очевидно, что код должен знать об ожидаемых конкретных реализациях, но теперь включения могут быть присоединены к интерфейсам (или дополнительно указаны в коде для ванильных моделей POCO).

person Marc Gravell    schedule 24.09.2010
comment
Было бы здорово, если бы вы могли поделиться патчем.... Также мне было интересно, могу ли я подключить protobuf-net к AppFabric, вы уже пробовали это? Кстати... отличная работа над проектом! - person ace; 24.09.2010
comment
@ace напишите мне (см. профиль) для патча. Re ppfabroc, не начиная с ранней бета-версии. Но вы всегда можете просто дать ему каплю :) - person Marc Gravell; 25.09.2010

Я предполагаю, что вам нужно добавить:

[ProtoInclude(1, typeof(MyClass1))]
[ProtoInclude(2, typeof(MyClass2))]

как к вашим MyClass1, так и к MyClass2, поскольку вы наследуете от MyInterface, и сериализация не будет знать тип.

person SwDevMan81    schedule 24.09.2010