2011-06-27 65 views
1

protobuf的消息,我有兩個班,我想轉換到protobuf的消息:擴大與子類

[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; 
} 

我所試圖實現的是ClassA的含B和C序列化。當序列化ClassD時,我會得到b,c,e和f。

這是可能的,或者我應該使用什麼樣的方法?我試圖避免嵌套消息。

使用我的方法序列化ClassD對象時出現問題。

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

在上面的序列化的數據兩者的嘗試只包含從ClassA的在D類的屬性和無。 我預計至少在ClassD中沒有一個屬性會在第一種情況下被序列化,我希望所有的ClassA和ClassD都在第二種情況下被序列化。

我該如何解決這個問題?

回答

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 {...} 

,只要它不與其他anythig從ClassA的衝突 「3」 可以是任何東西。

顯示爲電線上的嵌套消息,但會自動顯示。如果這是明確而不是你想要的,然後讓我知道。

+0

是的,這將單獨工作,但會引入稍微不同的消息佈局。如果沒有其他的方法,我正在考慮將所有屬性移動到ClassA中,並將與「ClassD」相關的屬性標記爲可選項。 – hultqvist

+0

@phq我可能可以在v2中按「原樣」執行操作;我會再看看 - 它不會工作分叉繼承(即,如果您發送一個D作爲A,它將反序列化爲A) - 需要檢查 –