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