2009-02-24 58 views
2

我正在使用protobuf-net進行協議緩衝。我有一個動態加載的DLL。我可以創建一個包含在dll中的數據類的實例,並且可以使用和修改創建的數據對象。但是,當我嘗試序列化/反序列化數據對象時,出現以下故障:協議緩衝區反序列化和動態加載的DLL

{「無法識別ProtoIncludeAttribute的已知類型:MyDataDLL.MyDataClass,MyDataDLL,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null「}

有時會發生崩潰,說MyDataClass不是MyBaseClass的子類,或類似的東西。 MyDataClass絕對繼承自MyBaseClass,而MyBaseClass具有MyDataClass的ProtoInclude標記。

Assembly theAssembly = Assembly.LoadFrom("MyDataDLL.dll"); 

Type theType = theAssembly.GetType("MyDataDLL.MyDataClass"); 

object theData = Activator.CreateInstance(theType); 

using (FileStream theStream = File.Open(fileName, FileMode.OpenOrCreate)) 
{ 
    MethodInfo method = typeof(ProtoBuf.Serializer).GetMethod("Deserialize").MakeGenericMethod(theType); 
    theData = method.Invoke(null, new object[] { theStream });      
} 

崩潰發生在「method.invoke」

如果我引用的DLL項目,並使用它的方式,我不明白的崩潰。所以我知道這是一個工作的DLL。


更新:是的,MyDataClass和MyBaseClass在同一個程序集中。

下面是我的代碼與您的測試類別不同的​​列表,雖然它可能並不廣泛: MyDataClass是7個ProtoIncludes列表中的第4個。

MyBaseClass包含所有數據字段,MyDataClass包含操作這些數據字段的函數的邏輯。所以在MyDataClass中沒有ProtoMember調用。

MyBaseClass實現IExtensible接口,並具有下列函數來處理額外的數據:

private ProtoBuf.IExtension extensionObject; 
ProtoBuf.IExtension ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)   { 
    return ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); 
} 

它可能不會影響什麼,但我ProtoContracts使用名稱參數。

+0

Re「有什麼額外的想法?在添加評論之前,我沒有看到您的修改;我可以更改測試以反映更新(當我得到第二個時),但我不確定IExtensible等會影響此更新。 – 2009-02-26 20:48:09

+0

我知道它已經有一段時間了 - 但我現在設法重現這一點。讓我知道如果你仍然對修復感興趣... – 2009-06-05 14:17:51

回答

1

好的,我會調查。我已經記錄了這個here。應該很有趣;-p 出於興趣,在同一個程序集中是MyDataClassMyBaseClass

順便說一下;在接下來的下降中,我打算包括Serialize等接受Type(而不是泛型) - 這將使「進行中」RPC棧變得更簡單,並且也將有助於您的使用。


更新;我添加了一個unit-test和(在一個單獨的dll中,通過Assembly.LoadFromtest classes加載)。單元測試通過。請你可以澄清你的代碼的不同之處(我需要一些我可以重現的東西來修復它)。