【发布时间】:2013-01-04 09:18:18
【问题描述】:
我在尝试使用 protobuf-net 序列化/反序列化复杂对象图时遇到一些问题。
我正在开发一个遗留应用程序,我们正在使用 .Net Remoting 将 GUI 客户端连接到 C# 服务。由于我们使用默认 BinaryFormatter 的对象图的序列化大小,我们看到海外用户的性能不佳,而客户端和服务器之间的有限带宽 (1Mbit/s) 加剧了这种情况。
作为一个快速的胜利,我想我会整理一个概念证明,看看通过使用 protobuf-net 是否有任何性能提升,通过实现 ISerializable。在我进行测试时,我遇到了一个没有维护对象引用的问题。
我已经整理了一个可以重现该问题的示例。我希望Dictionary (Items[1]) 中的对象和 B.A 对象与我在ProtoMember 属性中指定的AsReference=true 相同。
使用protobuf-net 2.0.0.619,我看到反序列化时抛出异常(反序列化期间引用跟踪的对象更改了引用)。
如果这不是受支持的方案,请告诉我。
测试
[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]);
}
类定义
[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>();
}
}
【问题讨论】:
-
看起来其他人也有类似的问题:stackoverflow.com/questions/6923891/… 标准列表和字典工作正常;但是,我有一个未完成的更改请求来支持字典中的 AsReference。意思是,Dictionary
目前不会运行 Foo 的图形代码,但如果它给你带来很大的痛苦,我可能会花一些时间来看看这个 如果它对我很有帮助,如果图形代码确实为 Foo 运行 :) -
作为一个更新:我已经努力让它以一种不需要大惊小怪的方式工作。我还有一个问题需要解决,目前的行为取决于发现类型的顺序(这显然是非常不可取的),我需要解决这个问题。
-
好东西,很高兴听到您能够如此迅速地完成某些工作。
-
AsReferenceDefault上的可选属性属性ProtoContract将在下一个版本中完全正常工作
标签: c# serialization protobuf-net