2009-02-24 44 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加载)。单元测试通过。请你可以澄清你的代码的不同之处(我需要一些我可以重现的东西来修复它)。