最近発見したように、protobuf-netで2つのクラスProtoBuf.Serializer
とを使用してシリアル化/逆シリアル化できProtoBuf.Meta.TypeModel
ます。たとえば、シリアル化/逆シリアル化するカスタムクラスがあるとします。
[ProtoContract]
public class Person
{
[ProtoMember(1)]
public string Name { get; set; }
[ProtoMember(2)]
public int Age { get; set; }
}
私たちは2つの方法でそれを行うことができます:
1)使用 TypeModel
TypeModel typeModel = RuntimeTypeModel.Default;
var person1 = new Person
{
Name = "John",
Age = 23
};
using (var stream = new MemoryStream())
{
typeModel.Serialize(stream, person1);
stream.Position = 0;
var pesrson2 = typeModel.Deserialize(stream, null, typeof(Person));
}
2)使用Serializer
(これは私が見たほとんどのチュートリアルで選択された方法です)
var person1 = new Person
{
Name = "John",
Age = 23
};
using (var stream = new MemoryStream())
{
Serializer.Serialize(stream, person1);
stream.Position = 0;
var pesrson2 = Serializer.Deserialize<Person>(stream);
}
これら2つのアプローチの違いは何ですか。これら2つの中から選択する方法は?そして、何であるTypeModel
とRuntimeTypeModel
最初の場所で?
すべてのSerializer.*
メソッドは、通常、の便利なプロキシRuntimeTypeModel.Default.*
です。おそらくいくつかのマイナーな例外があります-モデルにまったく触れないもの(たとえば、「varint」の処理)
基本的に、1。* APIでは、モデルは1つしかありませんでした。v2は、同じタイプを記述する並行/並列モデルを持つ機能を追加TypeModel
し、通常の実装がである、はるかに豊富なランタイム構成システム(これらすべてがカプセル化されていRuntimeTypeModel
ます)を追加しました。プリベイクされた実装を含むアセンブリをロードすることもできるTypeModel
ため、すべてTypeModel
がであるとは限らないことに注意してくださいRuntimeTypeModel
。
そう; 属性を持つ単純な型を使用している場合:を使用しても問題ありませんSerializer.*
。ランタイム構成と複数のモデルを使用してより高度なことを行う必要があるTypeModel
場合は、さまざまなインスタンスを追跡して、どのインスタンスを使用するかを把握する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加