2010-09-26 2 views
8

Я сталкиваюсь это исключение в моем проекте, используя Protobuf.net:protobuf.net Неожиданное подтип

InvalidOperationException "Unexpected sub-type: foo" 

У меня есть класс, который я посылаю, который выглядит следующим образом:

class message 
{ 
    list<bar> listOfBars; 
} 

foo наследует от бара, но protobuf, кажется, задыхается от этого и генерирует исключение выше. Есть ли способ обойти это? Мне нужно иметь возможность удерживать все разные подтипы бара в списке, поэтому решение с ограниченным типом будет сложно/невозможно.

ответ

14

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

[Serializable, ProtoContract, ProtoInclude(100, typeof(Foo))] 
class Bar { } 

[Serializable, ProtoContract] 
class Foo : Bar { } // Inherits from Bar 
+0

Я попробую, это займет некоторое время, потому что Bar и foo находятся в разных проектах. Думаю, мне придется немного поиграть с зависимостями:/ – Martin

+0

Спасибо, что сработало: D – Martin

+0

@Martin - проблем нет. – GenericTypeTea

0

Я не 100% на буферы протокола, и, может быть, я m отсюда, но вы думаете, что List можно назначить из списка, где Bar наследуется от Foo? Это не так - они считаются двумя разными типами без отношения. В .NET 4 поддерживаются параметры ковариационного типа, но для этого требуется поддержка из коллекции (какой список не предлагает даже в .NET 4, поскольку это было бы нарушением изменения - возможно, более старый код, который пытается это сломать в любом случае, но все равно изменение поведения)

+0

Я не предполагаю ковариацию, мне просто нужен Список , который я могу добавить (foo) в. – Martin