views:

30

answers:

2

I'm encountering this Exception in my project using Protobuf.net:

InvalidOperationException "Unexpected sub-type: foo"

I have a class which I'm sending which looks like this:

class message
{
    list<bar> listOfBars;
}

foo inherits off bar, However protobuf seems to choke on this and generate the exception above. Is there some way around this? I need to be able to hold all different subtypes of bar in the list, so a more type constrained solution would be difficult/impossible.

+2  A: 

I may be mistaken, but I think you need to specify on the inherited class which subtypes inherit from it, for example:

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

[Serializable, ProtoContract]
class Foo : Bar { } // Inherits from Bar
GenericTypeTea
I'll try that, it will take a while because Bar and foo are in different projects. I guess I'll have to fiddle around the dependancies a little :/
Martin
Thankyou, that worked :D
Martin
@Martin - no problem.
GenericTypeTea
@Martin @GenericTypeTea good answer; minor note -the [Serializable] isn't needed (but does no harm either)
Marc Gravell
A: 

I'm not 100% on protocol buffers, and maybe I'm way off base here but are you thinking that List is assignable from List where Bar inherits from Foo? This is not the case - they are considered two different types with no relation. In .NET 4, covariant Type parameters are supported but it requires support from the collection (which List does not offer even in .NET 4, as this would be a breaking change - arguably older code that attempts this is broken anyway, but it's still a change in behaviour)

x0n
I'm not assuming covariance, I simply want a List<bar> which I can add(foo) to.
Martin