协议缓冲区反序列化和动态加载的DLL

时间:2009-02-24 19:23:32

标签: c# reflection protobuf-net

我正在使用protobuf-net进行协议缓冲。我有一个动态加载的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使用Name参数。

1 个答案:

答案 0 :(得分:1)

好的,我会调查。我已经记录了这个here。应该很有趣;-p 出于兴趣,MyDataClassMyBaseClass在同一个程序集中?

顺便说一下;在下一篇文章中,我打算包括接受Serialize(而不是泛型)的Type等 - 这将使“正在进行”的RPC堆栈变得更加简单,并且也将有助于您的使用。


更新;我添加了unit-test和(在另一个dll中,通过Assembly.LoadFrom test classes加载)。单元测试通过了。请您澄清一下您的代码的不同之处(我需要一些我可以重现的东西来修复它)。