在.NET中跨AppDomains移动对象

时间:2009-06-11 15:20:42

标签: c# .net serialization immutability

有没有办法在AppDomains之间有效地共享或移动.NET对象?我意识到AppDomains的目的是提供隔离 - 但是我有一个案例需要移动一组相对较大的缓存的不可变对象,这些对象的计算和创建都很昂贵。目前,我有一个可行的序列化方法,但速度很慢。

5 个答案:

答案 0 :(得分:4)

如果没有对其进行序列化,则无法跨AppDomain移动对象。这是AppDomain的要点 - 您几乎可以将其视为一个完全独立的过程。

这是MarshallByRefObject发挥作用的地方。它允许您通过远程处理从其他AppDomain 使用对象,而无需在AppDomain边界上对其进行序列化。您仍然通过远程处理工作,因此它比将对象保留在同一AppDomain中要慢,但如果对象很大并且您不经常使用它,与序列化和反序列化相比,这可以节省大量时间它在第二个AppDomain中创建一个新副本。

答案 1 :(得分:2)

您可以尝试的一件事是从MarshalByRefObject派生您的对象。默认情况下,对象在AppDomains中按值进行编组。对于派生自MarshalByRefObject的对象,调用者将获得该对象的代理。所有调用都通过代理进行,然后编组到对象的应用程序域。这可以减少在两个应用程序域中创建所有对象的副本的需要。

答案 2 :(得分:1)

如何创建单独的应用程序空间来管理共享对象,然后使用Web服务或远程处理来获取/设置共享数据?您将基本上创建一个中央内存(取决于您存储数据的方式)存储库。

答案 3 :(得分:0)

我相信只有少数“受祝福”的物体能够“通过流血法造”,即只是让它跨越边界(弦是一体)

远程调用应该有效,如果它们很粗糙而不是试图复制整个事物(如果没有别的话会浪费很多内存)

答案 4 :(得分:0)

.NET Remoting是我所知道的最好的方法,虽然我的经验非常有限。如果你想使用它,你需要阅读Ingo Rammer的 Advanced .NET Remoting,Second Edition 和 Mario Szpuszta。当你开始谷歌搜索.NET Remoting Ingo的名字经常弹出。我发现这本书现在有点陈旧,但很有价值。我还没有尝试使用大型二进制序列化对象,但对于我一直在使用的较小对象看起来效率很高。我确实发现你不能拥有具有SecureString属性的对象,除非你想为它们实现自定义序列化/反序列化。