问题描述
||
观察以下琐碎的代码:
[ProtoContract]
public class B
{
[ProtoMember(1)] public int Y;
}
[ProtoContract]
public class C
{
[ProtoMember(1)] public int Y;
}
class Program
{
static void Main()
{
var b = new B { Y = 2 };
var c = new C { Y = 4 };
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms,b);
Serializer.Serialize(ms,c);
ms.Position = 0;
var b2 = Serializer.Deserialize<B>(ms);
Debug.Assert(b.Y == b2.Y);
var c2 = Serializer.Deserialize<C>(ms);
Debug.Assert(c.Y == c2.Y);
}
}
}
第一个断言失败!
每个Serialize语句将流位置前移2,因此最后ms.Position为4。但是,在第一个Deserialize语句之后,位置被设置为4,而不是2!实际上,b2.Y等于4,应该是c2.Y!的值!
这里绝对缺少一些基本的东西。我正在使用protobuf-net v2 r383。
谢谢。
编辑
它一定是真的很愚蠢,因为它在v1中也不起作用。
解决方法
您必须使用SerializeWithLengthPrefix / DeserializeWithLengthPrefix方法才能从流中检索单个对象。这应该工作:
var b = new B { Y = 2 };
var c = new C { Y = 4 };
using (var ms = new MemoryStream())
{
Serializer.SerializeWithLengthPrefix(ms,b,PrefixStyle.Fixed32);
Serializer.SerializeWithLengthPrefix(ms,c,PrefixStyle.Fixed32);
ms.Position = 0;
var b2 = Serializer.DeserializeWithLengthPrefix<B>(ms,PrefixStyle.Fixed32);
Debug.Assert(b.Y == b2.Y);
var c2 = Serializer.DeserializeWithLengthPrefix<C>(ms,PrefixStyle.Fixed32);
Debug.Assert(c.Y == c2.Y);
}