【问题标题】:Difference between Serializable and MarshalByRefObjectSerializable 和 MarshalByRefObject 的区别
【发布时间】:2013-10-11 10:22:51
【问题描述】:

我对 .NET Remoting 中的 [Serializable]:MarshalByRefObject 属性感到非常困惑。但是我阅读了很多关于此的文章。如果我使用 [Serializable] 属性,那么所有方法都完全在调用者域中执行,这意味着不同的调用者应该在他们自己的域中拥有不同方法的副本,并且一个调用者所做的任何更改都不应该反映在其他调用者身上。但是当相同时我在我的程序中实现的东西,我没有得到想要的结果。

【问题讨论】:

    标签: c# .net .net-remoting


    【解决方案1】:

    Serializable 属性用于签署一个对象,当通过远程处理请求它时,它将被序列化为一个字节数组,作为字节数组从源传输到目标,然后从该字节数组重建另一个对象实例在目标环境(AppDomain 或 Application)中生活和呼吸。对该对象执行的操作不会反映到源。要更新对象,您必须再次访问源并发送更改的对象(当然作为新的字节数组)。就像下载文件并修改它一样,您的更改不会反映到您下载文件的服务器。

    var user = server.GetUser("edokan");
    user.Alias = "edokan2";
    
    var user2 = server.GetUser("edokan");
    //user.Alias == user2.Alias; // is false
    

    另一方面,MarshalByRefObject 标记您的对象,而不是对象的数据,而是通过远程处理对您的对象的引用,并且每个方法调用/每个属性操作都在服务器端执行。这就像将您的问题发布到 StackOverflow 并阅读答案一样,您只有一个浏览器和一个 url 来查看/处理问题。一切都在 StackOverflow 服务器上执行。

    您的困惑源于一个非常简单的点,MS 使远程处理变得如此简单,实际上人们认为一切都在客户端。

    【讨论】:

    • 谢谢edokan。有效!!其实我做错了。现在我知道它们之间有什么区别了。
    【解决方案2】:

    添加到@edokan 答案,Serializable 属性基本上将类型标记为要序列化(即转换为字节流)。

    框架(例如 ORM 映射器、oodbs、持久性引擎)可以使用此信息来做出决策,例如何时应将对象的状态持久化在数据库中、通过网络发送等。

    您可以使用诸如BinaryFormatter 之类的类来获取标有Seri​​alizable 属性的对象,并从中创建字节流并将其存储在文件中和/或通过网络发送,然后从这些流中再次重建您的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 2011-03-20
      • 2010-10-10
      • 2014-02-25
      • 2011-05-31
      相关资源
      最近更新 更多