我正在使用 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 参数。