2

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

4

1 回答 1

1

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

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


更新; 我添加了一个单元测试和(在一个单独的 dll 中,通过Assembly.LoadFrom 测试类加载)。单元测试通过。请你澄清一下你的代码有什么不同(我需要一些我可以重现的东西来修复它)。

于 2009-02-24T20:38:58.330 回答