Сериализация класса, имеющего член типа интерфейса, с использованием protobuf-net - PullRequest
2 голосов
/ 24 сентября 2010

Я не могу сериализовать свой класс с помощью 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.Я получаю кодировку не установлена ​​ошибка.

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

Ответы [ 2 ]

1 голос
/ 24 сентября 2010

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

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

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


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

0 голосов
/ 24 сентября 2010

Полагаю, вам нужно добавить:

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

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

...