2012-02-21 9 views
2

私は素晴らしいProtobuf-NETを使用してモデルをシリアル化しようとしています。私は属性を使用することはできません(オブジェクトはコンパイル時に不明です)ので、TypeModelを構築しました。 私のオブジェクトモデルはクラスTestDataObjectで構成され、このクラスのプロパティはITestDataExtensionです。抽象基本クラスTestDataExtensionBaseはこのインターフェイス を実装し、クラスはTestDataExtension(コードではmyDataObjectExtA)はこのベースクラスから継承します。私はシリアル化されていない基本クラスのプロパティ次実行した場合Protobuf-netは、インターフェイスと抽象的なベースクラスを持つ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(); 

、と私はそれらをシリアル化する必要があります。

私TypeModelは、このように構成されています。私の意見で
私はこのような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

関連する問題