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

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

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

限制:

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

【问题讨论】:

    标签: c# serialization deserialization appdomain marshalbyrefobject


    【解决方案1】:

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

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

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

    【讨论】:

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