34

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

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

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

更新 どうやら、私はそれか何かの間違ったバージョンを持っています、しかしこれは私のSerializeクラスがどのように見えるかです:

私が見ているように、protobuf.netシリアライザークラス

4

2 に答える 2

31

これはあなたがそれを始めるのを助ける必要があります:Source&CreditMarc Gravell


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

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」からデータが読み戻されます。今回はタイプ()を指定する必要がありますが、それ以外のコードは非常に似ています。


更新:このパッケージをダウンロード すべてうまくいくようです

于 2013-01-26T10:21:13.620 に答える
10

iOSまたはUnity用の「CoreOnly」ビルドを選択したようですね。これは、google-codeダウンロードを使用していることを意味します。そのパッケージのルートには、さまざまなビルドの目的を説明する「必要なファイル.txt」があります。おそらく「フル」ビルドを使用する必要があります。または、もっと簡単に言うと、「フル」ビルドのみを含むNuGetデプロイを使用します。

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

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

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

于 2013-01-26T10:42:35.090 に答える