如何编组对象及其内容(也是对象)

时间:2010-06-18 10:03:51

标签: c# .net serialization marshalling

我有一个问题,我怀疑答案有点复杂。此刻我正在用C#编写DLL(类库)。此DLL使用第三方库,因此处理我没有源代码的第三方对象。现在我打算创建另一个DLL,它将在我的应用程序的后续体育场中使用。第二个DLL应该使用第一个DLL创建的第三方对象(具有相应的对象状态)。

幸运的是,第三方对象扩展了MarshalByRefObject类。我可以使用System.Runtime.Remoting.Marshal(...)封送对象。然后,我使用BinaryFormatter序列化对象,并将对象存储为byte[]数组。一切顺利。我可以以相反的方式反序列化和解组,最终得到我原来的第三方对象...所以看起来......

然而,当我在第三方反序列化对象上调用方法时,我得到了对象内部异常。通常这些方法返回其他第三方对象,但(显然 - 我猜)现在这些对象都丢失了,因为它们没有被序列化。

现在我的全局问题:我将如何编组/序列化我的第三方对象引用的所有对象...并级联“参考树”以获得完整且完整的序列化对象?现在我的猜测是预处理:获取所有对象并构建我自己的自定义对象并序列化它。但我希望还有其他方法......

1 个答案:

答案 0 :(得分:1)

我有点不清楚为什么你需要两个C#程序集来处理第三方DLL,是不是你创建的第一个类库已经连接到你的第三方DLL?以下是处理本机库时的一些常规答案。如果第三方库是公开可用的,它将有助于查看它使用的接口。

  1. 如果本机DLL公开其功能,您可以使用P / Invoke调用,在大多数情况下,将为您完成编组;
  2. 如果本机DLL将其方法公开为COM接口,则可以create COM wrappers;
  3. 如果您必须手动完成所有操作,可能需要使用LayoutKindFieldOffsetAttributeStructLayoutAttribute,这些属性可以帮助您告诉编译器内部存储器的布局如何对象是;
  4. 查看MarshalAsAttributeUnmanagedType,这可能正是您所需要的。