web-dev-qa-db-ja.com

protobuf-netの使用を開始する

私はprotobuf.netを始めようとしています。

here から最新バージョンをダウンロードし、[ProtoContract]クラスを実装しました。今では、 ドキュメントに記載されているように、ProtoBuf.Serializer.Serializeでシリアル化しようとしています。 。問題は、そのような方法がないことです。

[ProtoContract]をディスクに書き込むにはどうすればよいですか?

[〜#〜] update [〜#〜]どうやら、間違ったバージョンか何かを持っているようですが、ここに私のSerializeクラスは次のようになります。

protobuf.net Serializer class as I see it

32
Arsen Zahray

これは、あなたがそれを始めるのを助けなければなりません: ソースとクレジットマーク・グラヴェル


開始する最も簡単な方法は、単にデータを書き込むことです。

class Person {
    public int Id {get;set;}
    public string Name {get;set;}
    public Address Address {get;set;}
}
class Address {
    public string Line1 {get;set;}
    public string Line2 {get;set;}
}

これは良いスタートですが、それだけではprotobuf-netには十分ではありません。 XmlSerializerとは異なり、メンバー名はデータにエンコードされません-代わりに、各メンバーを識別する整数を選択する必要があります。さらに、意図を示すために、このタイプがシリアル化されることを示すことを示す必要があります(つまり、データコントラクトであること):

[ProtoContract]
class Person {
    [ProtoMember(1)]
    public int Id {get;set;}
    [ProtoMember(2)]
    public string Name {get;set;}
    [ProtoMember(3)]
    public Address Address {get;set;}
}
[ProtoContract]
class Address {
    [ProtoMember(1)]
    public string Line1 {get;set;}
    [ProtoMember(2)]
    public string Line2 {get;set;}
}

「プロトコルバッファ」はバイナリ形式であるため、protobuf-netはStreamクラスに大きく基づいています。これにより、さまざまな実装での使用が簡単になります。たとえば、ファイルに書き込むには:

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

これにより、32バイトのファイルが「person.bin」に書き込まれます。上記では明らかではないかもしれませんが、Serializeは一般的な方法です-行も次のようになります。

using (var file = File.Create("person.bin")) {
    Serializer.Serialize<Person>(file, person);
}

しかし、ほとんどの場合、コンパイラのジェネリック型推論に作業を任せることができます。データの逆シリアル化

データを取り戻す必要もあります!

Person newPerson;
using (var file = File.OpenRead("person.bin")) {
    newPerson = Serializer.Deserialize<Person>(file);
}

これにより、「person.bin」からデータが読み取られます。今回は型を伝える必要があることに注意してください()が、それ以外はコードは非常に似ています。


更新: このパッケージをダウンロード All seems fine

29
PaRiMaL RaJ

IOSまたはUnity向けの「CoreOnly」ビルドを選択したようです。つまり、Googleコードのダウンロードを使用しているということです。そのパッケージのルートには、「どのファイルが必要ですか?txt」があり、さまざまなビルドの目的を説明しています。おそらく「フル」ビルドを使用する必要があります。または、より単純に、「フル」ビルドのみを含むNuGetデプロイを使用します。

「CoreOnly」を使用する場合は、おそらく別の「プリコンパイル」ツールを使用してカスタムシリアライザーを生成する必要があります。

 var ser = new MyCustomSerializer();
 ser.Serialize(...);

このシナリオは、主にWindows Phone、Silverlight、iOSなどのライトフレームワークを対象としています。メタプログラミング/リフレクションは非常に制限されているか、完全に許可されていません。

8
Marc Gravell