Serializable和MarshalByRefObject之间的区别
我对.NET Remoting中的 [Serializable]和:MarshalByRefObject属性非常困惑。但是我读了很多文章。 如果我使用[Serializable]属性,那么所有方法都完全在调用者域中执行,这意味着不同的调用者应该在自己的域上拥有不同方法的副本,并且一个调用者所做的任何更改都不应该反映在其他调用者身上。但是当它们相同时我在我的程序中实现的东西,我没有得到理想的结果。
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属性的对象并从中创建字节流并将其存储在文件中和/或通过网络发送它,然后再从这些流重新构建对象。
- C#重载返回类型 – 推荐方法
- 异步HttpListener每次接收两次请求
- 将Env Conn字符串注入.NET Core 2.0 w / EF Core DbContext中的不同类lib比启动prj并实现IDesignTimeDbContextFactory
- 如何从.dll访问应用配置?
- DataObjects.NET可以支持SQL标识列吗?
- 是否可以以编程方式发送电子邮件而无需使用任何实际的电子邮件帐户
- 从Entity Framework 4.1 Code First中的NotMapped类派生实体类
- MemoryStream.CopyTo不工作
- 如何在.NET DLL中嵌入SQLite数据库,然后在C#中使用它?