我正在使用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参数。
最佳答案
好,我会调查。我已经记录了这个here。应该很有趣; -p
出于兴趣,MyDataClass
和MyBaseClass
是否在同一程序集中?
顺便说说;在下一滴中,我打算包括接受Serialize
(而不是泛型)的Type
等-这将使“进行中”的RPC堆栈更加简单,并且也将有助于您的使用。
更新;我添加了unit-test和(在单独的dll中,通过Assembly.LoadFrom
test classes加载)。单元测试通过。请您能说明一下您的代码有何不同之处(我需要复制一些东西才能对其进行修复)。