Serializable和MarshalByRefObject之间的区别

Sav*_*een 4 .net c# .net-remoting

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

Erd*_*tur 9

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

var user = server.GetUser("edokan");
user.Alias = "edokan2";

var user2 = server.GetUser("edokan");
//user.Alias == user2.Alias; // is false
Run Code Online (Sandbox Code Playgroud)

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

你的困惑源于一个非常简单的观点,MS使遥控变得如此简单,人们实际上认为一切都在客户端.