7

複数のオブジェクトを単一のストリームにシリアル化していますが、それらを読み戻そうとすると、最後のオブジェクト以外は何も取得できないようです:

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 は初期化されていないインスタンスです。これは予期された動作ですか? また、そうであれば、ストリーム内のランダムな位置からオブジェクトをどのように逆シリアル化しますか?

4

1 に答える 1

8

デフォルトは、protobuf (特に proobuf-net ではなく Google の仕様) は、連続するメッセージを単一のオブジェクトの一部として扱えるように設計されています。つまり、連結するだけでメッセージにフィールドを追加できます。ここ。各最上位オブジェクトは、(デフォルトでは)次のオブジェクトからの分離を一切持ちません。

それらを異なるオブジェクトとして扱うようにするには、*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);
于 2010-03-14T08:44:38.897 に答える