我正在使用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使用名稱參數。
Re「有什麼額外的想法?在添加評論之前,我沒有看到您的修改;我可以更改測試以反映更新(當我得到第二個時),但我不確定IExtensible等會影響此更新。 – 2009-02-26 20:48:09
我知道它已經有一段時間了 - 但我現在設法重現這一點。讓我知道如果你仍然對修復感興趣... – 2009-06-05 14:17:51