2

オブジェクトをファイルにシリアライズする Protobuf-net のソースコードを入手しました。

var person = new Person {
        Id = 12345, Name = "Fred",
        Address = new Address {
            Line1 = "Flat 1",
            Line2 = "The Meadows"
        }
    };
    using (var file = File.Create("person.bin")) {
        ProtoBuf.Serializer.Serialize(file, person);
    }

しかし、1 つのファイルにシリアル化したい Person のインスタンスが 2 つあるとします。どうやってやるの?

4

1 に答える 1

6

純粋な意味での protobuf には、ファイルの終わり以外に「ターミネーター」がありません (これは、ブロブを連結するだけでオブジェクトをマージ/結合できるようにするためです)。

ただし、たとえば、すべてのオブジェクトに後続のデータの長さをプレフィックスとして追加するなど、独自のマーカーを挿入できます。

protobuf-net は、SerializeWithLengthPrefixメソッドを公開することでこれをまとめます。これからデシリアライズするにはさまざまな方法がありますが、最も簡単なのはDeserializeItems、オブジェクトのストリーミング シーケンスを順番に提供する方法です (イテレータでストリームから遅延スプールするため、非常に大きなシーケンスに完全に適しています)。

詳細については、これがどのように実装されているかを確認できます: と を使用するPrefixStyle.Base128と、ネットワーク上では、fieldNumber次のようなラッパー オブジェクトがある場合と同じように見えます。

[ProtoContract]
public class DoesNotExist {
    [ProtoMember({fieldNumber})]
    public List<Person> People {get;set;}
}

主な違いは、実際のDoesNotExistタイプ/インスタンスが存在せず、作成されないことです。インスタンスList<T>を取得するだけです。Person

于 2013-03-07T07:53:32.507 に答える