5

protobuf-netの継承機能に関する多くの質問を読みました。[ProtoContract]、[ProtoMember]と同じように[DataContract]、[DataMember]を使用できるのではないかと思います。[ProtoInclude]の代わりに[KnowType]を使用できないのはなぜですか?

すでにprotobuf-netのシリアル化に[DataContract]、[DataMember]を使用しているので、この質問を提起します。「Protobuf-net」を追加する必要はありませんでした。「System.Runtime.Serialization」のみを使用しました。

しかし...クラスが何らかのクラスから継承する必要がある場合、[ProtoInclude]属性に「Protobuf-net」を追加する必要がありますか?例えば、

using System.Runtime.Serialization;
namespace test
{

[DataContract]
/// [KnowType(typeof(SomeClass))]
/// or
/// [ProtoInclude(100,typeof(SomeClass))]
public class BaseClass
{
   //...
   [DataMember(Order=1)]
   public string BlahBlahBlah {get; set;}
}

[DataContract]
public class ChildClass1 : BaseClass
{
   //...
   [DataMember(Order=1)]
   public string BlahBlahBlah {get; set;}
}
}// end namespace

最後に、私は100の子クラスを持っているのだろうか、基本クラス内に100の[ProtoInclude]タグを追加することに夢中になりませんか?

助けのためのadvのThx

ヴィー

4

1 に答える 1

5

編集:これはv2では不要になりました-実行時にこれを指定するか、を使用できますDynamicType


この理由は、protobufワイヤーフォーマット(Googleによって考案された)にはタイプメタデータが含まれていないため、話しているオブジェクトのタイプを知るための何らかの方法が必要です。[KnownType]はこの情報を提供しません。また、堅牢なキーを個別に提供する明確な方法はありません。

実際、protobufは継承もサポートしていません。protobuf-netは、サブタイプをネストされたメッセージとして扱うことで、継承を回避します。したがって、ChildClass1実際には、次のように、サブオブジェクトのプロパティであるかのように転送中に表示されます。BlahBlahBlah

message BaseClass {
    optional ChildClass1 ChildClass1 = 1;
    optional SomeOtherSubType SomeOtherSubType = 2;
}
message ChildClass1 {
    optional string BlahBlahBlah = 1;
}

省略し直してください。「v2」では、独自のコードを使用して、タイプモデルの外部でこのデータを指定するオプションがあります。つまり、すべてを装飾する必要はありませんが、キーをタイプに関連付けるためのメカニズムが必要です。

于 2010-06-23T14:21:40.483 に答える