Десериализация ссылки на объект 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();
    }
}

Ответы на вопрос(3)

Ваш ответ на вопрос