2011-06-27 4 views
1

でいるProtobufメッセージを展開します。私はメッセージをいるProtobufするために変換したい2つのクラスを持っているサブクラス

[ProtoContract] 
class ClassA { 
    [ProtoMember(1)] 
    public int b; 
    [ProtoMember(2)] 
    public int c; 
} 

[ProtoContract] 
class ClassD : ClassA 
{ 
    [ProtoMember(3)] 
    public int e; 
    [ProtoMember(4)] 
    public int f; 
} 

私は何を達成しようとしていることはbとcを含むにClassAのシリアル化です。 ClassDをシリアライズすると、b、c、e、fが得られます。

これは可能ですか、どのようなアプローチを使用しますか?私はネストされたメッセージを避けようとしています。

私のアプローチを使用すると、ClassDオブジェクトをシリアライズするときに問題が発生します。

ClassD d = new ClassD(); 
Serialize.Serialize<ClassA>(stream, d); 
Serialize.Serialize<ClassD>(stream, d); 

上記の両方の試みでは、シリアル化されたデータにはClassDのプロパティのみが含まれ、ClassAのプロパティは含まれません。 ClassDのプロパティの少なくともいずれも最初のケースで直列化されるとは限りません。 と私はClassAとClassDの両方を2番目のケースで直列化したいと思います。

どのようにこの問題にアプローチしますか?

答えて

1

これは継承せずにv2のに働くように見えます:

var model = TypeModel.Create(); 
    model.Add(typeof(ClassA), false).Add("b", "c"); 
    model.Add(typeof(ClassD), false).Add("b", "c", "e", "f"); 

    var a = new ClassA { b = 1, c = 2 }; 
    var aClone = (ClassA)model.DeepClone(a); 
    Debug.Assert(aClone.b == 1); 
    Debug.Assert(aClone.c == 2); 

    var d = new ClassD { b = 1, c = 2, e = 3, f = 4}; 
    var dClone = (ClassD)model.DeepClone(d); 
    Debug.Assert(dClone.b == 1); 
    Debug.Assert(dClone.c == 2); 
    Debug.Assert(dClone.e == 3); 
    Debug.Assert(dClone.f == 4); 

これらは各ネストされていない、フラットなモデルになります。それがデフォルトでモデルを構築する方法の一部ではないとして、現時点ではこれは、(上記のように)明示的な設定が必要になります - しかし、当然の結果として、あなたがここに属性を必要としない:

class ClassA 
{ 
    public int b; 
    public int c; 
} 
class ClassD : ClassA 
{ 
    public int e; 
    public int f; 
} 
1

確か:

[ProtoContract, ProtoInclude(3, typeof(ClassD))] 
class ClassA {...} 

"3" は、それがanythig他にClassAからと衝突しないよう何もすることができます。

このは、が自動的にネストされたメッセージとして表示されますが、自動的に表示されます。これが明白にでない場合は、あなたが望むものがあれば教えてください。

+0

はいこの単独では動作しますが、わずかに異なるメッセージレイアウトが導入されます。それ以外の方法がない場合、私はClassAにすべてのプロパティを移動し、 "ClassD"関連のものをオプションとしてマークすることを検討しています。 – hultqvist

+0

@phq v2では "そのまま"することができます。私は後で見てみましょう - それはフォーク継承の目的では動作しませんが(つまり、DをAとして送信すると、Aとして非直列化されます) - チェックする必要があります –

関連する問題