I get that protobuf do not support inheritance, and since I am using protoc-c on another end, I do not want to use any extensions as well. However, I am stuck with a C# model that depends on inheritance:
class Header {
public int version { get; set; }
}
class Message : Header {
public String message { get; set; }
}
I attempted to switch the inheritance into encapsulation in the wire format to something like this:
[ProtoContract]
class Header {
[ProtoMember(1)]
public int version { get; set; }
}
[ProtoContract]
class Message : Header {
[ProtoMember(1)]
public Header Header { get { return this; } set { } }
[ProtoMember(2)]
public String Message { get; set; }
}
Then I get the “Unexpected sub-type” error which prompts me to:
Why I have to use [ProtoInclude]?
I feel that my case is different than the case in the above question, so would like to ask again for my specific case, where I have tried to inside out the inheritance, is this impossible to do without having ProtoInclude?
If not, how would I do it in v2?
—– EDITED ——
My proto file in the C (using protobuf-c) side is something like this:
message Header {
optional int32 version = 1;
}
message Message {
optional Header header = 1;
optional string message = 2;
}
I do not want to put the Message inside the Header, and I do not want the inheritance-over-the-wire feature. This format enables me to add stuffs into the Header message easily without needing to change the Message message.
With the edit: no, that scenario is not directly supported – protobuf-net is highly aware of inheritance, and isn’t very amenable to ignoring it. This seems such an unusual case that I’m not desperate to add it, and I thing the
return this;getter and no-op setter would cause additional downstream complications (not bugs, since it isn’t expected to support that) which could be pretty hard to rectify.I would advise using a model that is similar to the structure you want to represent. If this isn’t directly possible, you can use a surrogate instead. The following works and retains both your intended wire-structure and the existing type inheritance: