将“非序列化”对象传递给另一个没有序列化/反序列化 (C#) 的应用程序域

Posted

技术标签:

【中文标题】将“非序列化”对象传递给另一个没有序列化/反序列化 (C#) 的应用程序域【英文标题】:Pass a "non-serialized" object to another appdomain without Serilization/Deserialization (C#) 【发布时间】:2019-05-09 08:40:36 【问题描述】:

将“非序列化”对象传递到另一个应用域没有序列化/反序列化的最佳方式是什么?

更多细节:我将在新的 appdomain 中调用一个函数(来自外部程序集/插件)并将结果传递给主 appdomain(主程序)。但是(不幸的是)结果类型不可序列化,因此我遇到了 SerializationException

限制:

非序列化类型在外部程序集/dll 中。所以我不能用属性将它标记为可序列化。

【问题讨论】:

【参考方案1】:

如果你想通过远程基础设施传递它,它必须是通过 ref 或可序列化的。

由于这两种类型都不是你有有限的选择:

    在远程应用程序域中执行处理。 执行自定义序列化以传输您想要的数据(而不是对象)。例如,将值复制到可序列化的 DTO 类或使用序列化程序库。

【讨论】:

第二个选项似乎更复杂(对吗?)...但是您能否提供有关第一个选项的更多信息(链接)? 对于(1),您可以通过 AppDomain.DoCallback 或通过编写自定义 MarshalByRefObject 在远程应用程序域中执行,在远程域中创建一个实例并对其进行调用。 (2) 可能非常简单。没有什么能真正阻止这些对象被序列化。 Serializable 属性是人为的限制。您可以使用二进制序列化程序库并序列化任何内容。它可能有效或无效,取决于类的编写方式。 谢谢。对于(1),我找到了这个链接,但似乎 Execute 方法有问题。你能看看那个(或给我另一个样本)吗? link 不确定您所说的执行方法。自从我使用 AppDomains 以来已经 10 年了,所以我不再记得如何在远程 AppDomain 中创建一个实例。但这并不难。我相信您可以找到有关如何执行此操作的材料。这似乎展示了如何做到这一点:***.com/questions/1767439/…

以上是关于将“非序列化”对象传递给另一个没有序列化/反序列化 (C#) 的应用程序域的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给反序列化json的构造函数

如何将库类或对象传递给片段?

如何将不可序列化的对象传递给意图服务?

将 Django 对象传递给 ExtJS 的正确方法

打开新页面,反序列化 GWT 中的对象

将进程中的连接对象传递给python中的主进程