最简单的protobuf-net示例需要帮助

时间:2011-05-24 08:43:45

标签: .net protobuf-net

请注意以下一小段代码:

  [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中也不起作用。

1 个答案:

答案 0 :(得分:2)

您必须使用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);
}