将“非序列化”对象传递给另一个没有序列化/反序列化 (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#) 的应用程序域的主要内容,如果未能解决你的问题,请参考以下文章