Serializable 和 MarshalByRefObject 之间的区别

本文关键字:区别 之间 MarshalByRefObject Serializable | 更新日期: 2023-09-27 18:34:49

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

Serializable 和 MarshalByRefObject 之间的区别

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

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答案之外,Serializable 属性基本上将类型标记为要序列化(即转换为字节流(。

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

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