Deserialización de la referencia del objeto Protobuf-net utilizando el Diccionario: un objeto con referencia de seguimiento cambió la referencia durante la deserialización

Tengo algunos problemas al intentar serializar / deserializar un gráfico de objeto complejo utilizando protobuf-net.

Estoy trabajando en una aplicación heredada y estamos usando .Net Remoting para conectar un cliente GUI a un servicio C #. Estamos viendo un bajo rendimiento con los usuarios extranjeros debido al tamaño serializado de nuestros gráficos de objetos utilizando el valor predeterminadoBinaryFormatter, que se ve agravada por el ancho de banda limitado entre el cliente y el servidor (1Mbit / s).

Como ganancia rápida, pensé que armaría una prueba de concepto para ver si se podían obtener mejoras de rendimiento utilizando protobuf-net en su lugar, implementandoISerializable. Cuando estaba probando, me encontré con un problema por el cual no se mantenían las referencias de objetos.

He reunido un ejemplo que reprosca el problema. Estoy esperando que el objeto en elDictionary (Elementos [1]) y el objeto B.A será el mismo que he especificadoAsReference=true en elProtoMember atributo.

Utilizandoprotobuf-net 2.0.0.619, Estoy viendo una excepción lanzada cuando se deserializa (Un objeto con seguimiento de referencia cambió la referencia durante la deserialización).

Si esto no es un escenario compatible, por favor hágamelo saber.

Prueba

[Test]
public void AreObjectReferencesSameAfterDeserialization()
{
    A a = new A();
    B b = new B();

    b.A = a;

    b.Items.Add(1, a);

    Assert.AreSame(a, b.A);
    Assert.AreSame(b.A, b.Items[1]);

    B deserializedB;

    using (var stream = new MemoryStream())
    {
        Serializer.Serialize(stream, b);
        stream.Seek(0, SeekOrigin.Begin);
        deserializedB = Serializer.Deserialize<B>(stream);
    }

    Assert.AreSame(deserializedB.A, deserializedB.Items[1]);
}

Definiciones de clase

[Serializable]
[ProtoContract]
public class A
{
}

[Serializable]
[ProtoContract]
public class B
{
    [ProtoMember(1, AsReference = true)]
    public A A { get; set; }

    [ProtoMember(2, AsReference = true)]
    public Dictionary<int, A> Items { get; set; }

    public B()
    {
        Items = new Dictionary<int, A>();
    }
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta