Десериализация ссылки на объект Protobuf-net с использованием словаря: объект отслеживания ссылок изменил ссылку во время десериализации
у меня возникли некоторые проблемы при попытке сериализации / десериализации графа сложных объектов с использованием protobuf-net.I '
я работаю над устаревшим приложением, и мыповторно использовать .Net Remoting для подключения клиента GUI к службе C #. Мы наблюдаем низкую производительность с зарубежными пользователями из-за сериализованного размера наших графов объектов с использованием значений по умолчаниюBinaryFormatter
, что усугубляется ограниченной пропускной способностью между клиентом и сервером (1 Мбит / с).
Как быстрая победа, я думал, чтоя собрал доказательство концепции, чтобы увидеть, есть ли какой-либо выигрыш в производительности, используя вместо этого protobuf-net, реализуяISerializable
, Во время тестирования я столкнулся с проблемой, из-за которой ссылки на объекты не былиT поддерживается. Я
Мы собрали пример, который воспроизводит проблему. Я'м, ожидая, что объект вDictionary
(Пункты [1]) и объект B.A будут такими же, как I 'мы указалиAsReference=true
вProtoMember
приписывать.
С помощьюprotobuf-net 2.0.0.619
Яя вижу исключение, возникающее при десериализации (объект, отслеживаемый ссылками, изменил ссылку во время десериализации).
Если это неt поддерживаемый сценарий, пожалуйста, дайте мне знать.
Тестовое задание
[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(stream);
}
Assert.AreSame(deserializedB.A, deserializedB.Items[1]);
}
Определения классов
[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 Items { get; set; }
public B()
{
Items = new Dictionary();
}
}