تحيز النوع في موقف الدفق الحالي مع Protobuf-Net

StackOverflow https://stackoverflow.com/questions/2441608

  •  19-09-2019
  •  | 
  •  

سؤال

أنا تسلسل عدة أشياء في مجرى واحد، ولكن عندما أحاول أن أقرأها مرة أخرى، لا أستطيع أن أبدو أن أحصل على أي شيء سوى الكائن الأخير:

ProtoBuf.Serializer.Serialize(stream, postA1);
ProtoBuf.Serializer.Serialize(stream, postB1);
stream.Position = 0;
var postA2 = ProtoBuf.Serializer.Deserialize<Post>(stream);
var postB2 = ProtoBuf.Serializer.Deserialize<Post>(stream);

أول التحمل ينقل الدفق إلى النهاية و posta2 يحتوي على قيمة postb1، في حين أن postb2 مجرد مثيل غير مهم. هل هذا السلوك المتوقع، وإذا كان الأمر كذلك، كيف يمكنك تحيز كائن من موقف عشوائي في مجرى؟

هل كانت مفيدة؟

المحلول

بواسطة إفتراضي, تم تصميم Protobuf (Google Spec، Not Proobuf-Net على وجه التحديد) للسماح لك بتعامل مع رسائل متتالية كجزء من كائن واحد - أي يمكنك إضافة حقول إلى رسالة ببساطة عن طريق التزامن، وهو ما تفعله بشكل أساسي هنا. كل كائن من المستوى الأعلى لا (افتراضيا) أي نوع من الفصل عن الكائن التالي.

للحصول عليه لعلاجها ككائنات مختلفة، انظر إلى *WithLengthPrefix الأساليب (أو يمكنك استخدام IEnumerable<T> إصدارات - ربما DeserializeItems; ؛ لاحظ أيضا أنه سيتم تطبيق بادئات الطول تلقائيا إذا أعطيتها شيئا مثل قائمة تسلسل)؛ علي سبيل المثال:

بشكل أساسي:

Serializer.SerializeWithLengthPrefix(stream, postA1, PrefixStyle.Base128, 1);
Serializer.SerializeWithLengthPrefix(stream, postB1, PrefixStyle.Base128, 1);
stream.Position = 0;
var postA2 = Serializer.DeserializeWithLengthPrefix<Post>(stream,
    PrefixStyle.Base128, 1);
var postB2 = Serializer.DeserializeWithLengthPrefix<Post>(stream,
    PrefixStyle.Base128, 1);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top