Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

protobuf-net serializing object graph

If I have object A and B both contain some field serialized field F, and both point to the same serializable object C. Does protobuf-net serialize by reference or serialize by value? When the object graph is deserialized, does protobuf-net generate 2 separate objects for A.F and B.F? I'm asking because I want to know if serialization preserves reference equality.

like image 442
jz87 Avatar asked Jun 09 '11 14:06

jz87


1 Answers

The raw "protobuf" spec, a defined by Google, is a tree serializer (like XmlSerializer). So by default you would get C serialized twice, and two different objects when deserialized.

However, this is such a common question that in "v2" I provide this as an opt-in behaviour; note you should only use this for protobuf-net to protobuf-net, as other clients will not expect this configuration (although it remains a valid protobuf stream).

For example (using attributes, bit you can also use a runtime model instead):

[ProtoContract]
public class A {
    ...
    [ProtoMember(5, AsReference=true)]
    public C Foo {get;set;}
}

[ProtoContract]
public class B {
    ...
    [ProtoMember(7, AsReference=true)]
    public C Bar {get;set;}
}

[ProtoContract]
public class C {...}

This will serialize the instance once, generating an id unique in the output. When deserialized, the same object will be used in both places.

like image 82
Marc Gravell Avatar answered Nov 01 '22 14:11

Marc Gravell