1

protobuf-netを使おうとすると、次のような問題が発生しました。私には2つのクラスがあります。

[ProtoContract]
class parent
{
    [ProtoMember(1)]
    public string name { get; set; }
}

[ProtoContract]
class child : parent
{
    [ProtoMember(2)]
    public int num { get; set; }
}

子プロパティ「num」を設定せずに子オブジェクトを作成した場合

var obj = new child() { name = "tester" };

シリアル化してみてください

using (var stream = new MemoryStream())
{
    Serializer.NonGeneric.Serialize(stream, obj);
}

ストリームは空になります。

親クラスの属性[ProtoInclude]を使用せずにこの状況を処理する方法はありますか?
私はprotobuf-netv2r480を使用しています。

ありがとう

4

1 に答える 1

1

ここでの正解、サブタイプについて伝えるために ProtoInclude を使用することです。それ以外の場合は、「子」に関連するシリアル化のみであり、興味深いデータがなければ (デフォルトではゼロは興味深いとは見なされません)、長さゼロのストリームが正しいシリアル化です。Protobuf は空のストリームを排除しません。

コンパイル時に型がわからないために ProtoInclude を使用できない場合は、使用できます。

RuntimeTypeModel.Default[typeof(parent)]
    .AddSubType(number, typeof(child));

「数値」後で正確に再現できる必要があることに注意してください。そうしないと、正しく逆シリアル化されません。

于 2012-07-13T17:45:22.790 に答える