Desserialização de referência de objeto Protobuf-net usando o Dictionary: Um objeto de referência controlado mudou de referência durante a desserialização

Eu estou tendo alguns problemas tentando serializar / desserializar um gráfico de objeto complexo usando protobuf-net.

Estou trabalhando em um aplicativo legado e estamos usando o .net Remoting para conectar um cliente GUI a um serviço C #. Estamos vendo um desempenho ruim com usuários no exterior devido ao tamanho serializado de nossos gráficos de objetos usando o padrãoBinaryFormatter, que é exacerbado pela largura de banda limitada entre o cliente e o servidor (1Mbit / s).

Como uma vitória rápida, eu pensei em montar uma prova de conceito para ver se havia algum ganho de desempenho usando o protobuf-net, implementandoISerializable. Enquanto eu estava testando, me deparei com um problema no qual referências a objetos não estavam sendo mantidas.

Eu coloquei um exemplo que reprop o assunto. Eu estou esperando que o objeto noDictionary (Itens [1]) e o objeto B.A será o mesmo que eu especifiqueiAsReference=true noProtoMember atributo.

Usandoprotobuf-net 2.0.0.619, Estou vendo uma exceção lançada quando desserializing (um objeto de referência de referência alterada durante a desserialização).

Se este não é um cenário suportado, por favor me avise.

Teste

[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]);
}

Definições de classe

[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>();
    }
}

questionAnswers(3)

yourAnswerToTheQuestion