Нужна помощь с самым тривиальным примером protobuf-net - PullRequest
1 голос
/ 24 мая 2011

Соблюдайте следующий тривиальный код:

  [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.

Спасибо.

EDIT

Это должно быть что-то действительно глупое, потому что это не работает и в v1.

1 Ответ

2 голосов
/ 24 мая 2011

Вы должны использовать методы 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);
}
...