2

次の 3 つのクラスがあるとします。

[ProtoContract]
[ProtoInclude(10, typeof(FirstType))]
[ProtoInclude(20, typeof(SecondType))]
public class Base
{
    [ProtoMember(1)]
    public int ClassId {get;set;}
}

public class FirstClass : Base
{
    ...
}

public class SecondClass : Base
{
   ...
}

また、(基本クラスの) クラス ID と、一致する子クラスの型の間には関係があります。例えば、

var obj1 = new FirstClass() {ClassId = 1}
var obj2 = new SecondClass() {ClassId = 2}

これらのオブジェクトをシリアライズしたとしましょう。問題は、 ClassId フィールドを調べて、クラス Id 値に基づいてシリアル化された protobuf を逆シリアル化する良い方法はありますか? つまり、シリアライズされた protobuf の classId の値が 1 の場合、FirstClass を使用して残りのストリーム バイトをデシリアライズします。

ありがとう!

4

1 に答える 1

0

ProtoInclude を使用している場合、protobuf-net は使用するサブクラスを既に処理しています。これが ProtoIncludeの要点です。場合によっては、継承を使用できない場合があります。その場合、ProtoReader を介して、またはそのプロパティのみを読み取る 2 番目のモデルを使用してプロト ストリームを読み取り、ソースをリセットして再度読み取る方法があります。ここにその例があります: https://stackoverflow.com/a/14572685/23354

于 2013-02-14T21:42:06.253 に答える