6

一部のクラスをシリアル化するために Protobuf.net を使用しています。基本クラスで [ProtoInclude] を指定しなくても、SuperHero クラス (以下) をシリアル化できるようにしたいと考えています。これは、派生クラスは自動的に生成されますが、基本クラスは生成されないためです。そのため、基本クラスはその派生クラスを直接認識していません。

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

    [ProtoContract]
    class SuperHero : Person
    {
        [ProtoMember(3)]
        public string Powers { get; set; }
    }

protobuf.net の最新バージョンを使用しています。

4

1 に答える 1

6

最初の注意: ある時点で、コードはサブクラスについて知っている必要があります (おそらく構成を介して)。どういうわけか、各サブタイプの数値を確実に再現できることが重要です。データをディスクなどに保存している場合、実行時にタイプを見つけたときにカウンターをインクリメントするだけでは不十分です。次回の実行時にタイプが同じ順序で見つからない可能性があるためです。そう; 何らかのメカニズムを介して、SuperHero を Person のサブクラスとして表す一意の正の整数があると仮定します。

int tag = 7; // why not
Type subType = typeof(SuperHero);

次に、このサブタイプについて protobuf-net に伝えます。

RuntimeTypeModel.Default.Add(typeof(Person), true).AddSubType(tag, subType);

これは、属性処理コードが見たときに行うことと同じです。[ProtoInclude(...)]

于 2012-08-08T17:04:35.337 に答える