2011-06-09 12 views
15

Si tengo el objeto A y B ambos contienen algún campo de campo serializado F, y ambos apuntan al mismo objeto serializable C. ¿Protobuf-net se serializa por referencia o se serializa por valor? Cuando el gráfico objeto se deserializa, ¿protobuf-net genera 2 objetos separados para A.F y B.F? Pregunto porque quiero saber si la serialización preserva la igualdad de referencia.protobuf-net serializing object graph

Respuesta

17

La especificación cruda "protobuf", definida por Google, es un serializador de árbol (como XmlSerializer). De modo que de forma predeterminada obtendría una serialización C dos veces y dos objetos diferentes cuando se deserializara.

Sin embargo, esta es una pregunta tan común que en "v2" proporciono esto como un comportamiento de aceptación; tenga en cuenta que solo debe usar esto para protobuf-net a protobuf-net, ya que otros clientes no esperan esta configuración (aunque sigue siendo una secuencia protobuf válida).

Por ejemplo (utilizando atributos, el bit también se puede utilizar un modelo de tiempo de ejecución en su lugar):

[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 {...} 

Esto serializar la instancia una vez, la generación de un ID único en la salida. Cuando se deserializa, el mismo objeto se usará en ambos lugares.

+1

Wow, honestamente no esperaba la característica de referencia, ya que pensé que el formato subyacente probablemente no lo admite, dado el propósito original de PB. Esto es realmente increíble. – jz87

+2

Sin embargo, al igual que una pregunta de seguimiento, si serializo una matriz por referencia, ¿todos los elementos de esa matriz se serializan también por referencia o solo la matriz de nivel superior? – jz87

+0

@ jz87 buena pregunta. Honestamente, tendría que comprobar y volver a contactarlo –