2012-02-21 80 views
2

我想使用偉大的Protobuf-NET序列化模型。我不能使用屬性(對象在編譯時是未知的),所以我構造了一個TypeModel。 我的對象模型由類TestDataObject組成,此類具有屬性ITestDataExtension。抽象基類TestDataExtensionBase實現此接口 和類TestDataExtension(代碼中的myDataObjectExtA)從此基類繼承。Protobuf網創建帶有接口和抽象基類的typemodel

我TypeModel構造是這樣的:

 System.IO.MemoryStream tmpMemoryStream = new System.IO.MemoryStream(); 
     RuntimeTypeModel model = TypeModel.Create(); 
     MetaType basetype = model.Add(typeof(TestDataObject), true); 
     MetaType interfaceType = model.Add(typeof(ITestDataExtension), true); 
     //MetaType extBaseType = interfaceType.AddSubType(100, typeof(TestDataExtensionBase)); 
     MetaType extType = interfaceType.AddSubType(200, myDataObjectExtA.GetType()); 
     model.Add(typeof(TestDataExtensionBase), true); 
     model.Add(myDataObjectA.Ext.GetType(), true); 
     model.CompileInPlace(); 
     model.Serialize(tmpMemoryStream, myDataObjectA); 
     byte[] tmpDat = tmpMemoryStream.ToArray(); 

如果我運行的基類的屬性,以下是沒有序列號,和我需要他們被序列化。
在我看來,我應該已經添加亞型的TestDataExtensionBase這樣的:

 MetaType extBaseType = interfaceType.AddSubType(100, typeof(TestDataExtensionBase)); 
     MetaType extType = extBaseType.AddSubType(200, myDataObjectExtA.GetType()); 

但是,這導致:意外的亞型:TestDataExtension。 有沒有人知道我做錯了什麼?任何幫助,將不勝感激。

回答

4

2個問題:僅目前提供了一種用於成員,不根對象(由於多接口繼承的問題)

  • 接口支持;解決這個問題的最簡單的方法是使用包裝對象與接口成員
  • 有必要在模型

來定義子類型我認爲你也描述一下下面...?

using System; 
using ProtoBuf.Meta; 

interface ITest 
{ 
    int X { get; set; } 
} 
abstract class TestBase : ITest 
{ 
    public int X { get; set; } // from interface 
    public int Y { get; set; } 
} 
class Test : TestBase 
{ 
    public int Z { get; set; } 
    public override string ToString() 
    { 
     return string.Format("{0}, {1}, {2}", X, Y, Z); 
    } 
} 
class Wrapper 
{ 
    public ITest Value { get; set; } 
} 
public class Program 
{ 
    static void Main() 
    { 
     var model = TypeModel.Create(); 
     model.Add(typeof (ITest), false).Add("X") 
       .AddSubType(10, typeof (TestBase)); 
     model.Add(typeof (TestBase), false).Add("Y") 
       .AddSubType(10, typeof (Test)); 
     model.Add(typeof (Test), false).Add("Z"); 
     model.Add(typeof (Wrapper), false).Add("Value"); 

     Wrapper obj = new Wrapper {Value = new Test() 
       {X = 123, Y = 456, Z = 789}}; 

     var clone = (Wrapper)model.DeepClone(obj); 
     Console.WriteLine(clone.Value); 
    } 
} 
+0

一如既往的anwser顯然非常簡單,這就像一個魅力。非常感謝您的快速響應。 – pabes 2012-02-21 14:50:14