使用MarshalByRefObject与序列化相比有多贵?

sha*_*oth 7 .net c# performance serialization marshalling

在我的Azure Web角色代码中,我有一个CustomIdentity派生自的类System.Security.Principal.IIdentity.在某些时候,.NET运行时尝试序列化该类,序列化将无法正常工作.试图解决我搜索了很多,找到了这个答案,并试图继承我的班级MarshalByRefObject.

现在,一旦我的CustomIdentity类继承,MarshalByRefObject就不再有序列化尝试了,我的代码就可以工作了.但是,我想知道使用MarshalByRefObject类的性能影响.

我的代码运行方式如下.首先,请求到达IIS并传递给身份验证代码,该代码创建实例CustomIdentity并将该实例附加到HTTP上下文.然后一段时间后,相同的HTTP上下文被传递给ASP.NET处理程序,该处理程序CustomIdentity最多访问该实例一次.该CustomIdentity对象的生活为请求的时间,然后被销毁.

现在通过序列化,我CustomIdentity将序列化为流,然后从该流反序列化为新对象.由于MarshalByRefObject没有序列化,但创建了代理,并且访问将通过RPC封送到实际对象所在的位置.

MarshalByRefObject在这种情况下使用会有多贵?哪个 - MarshalByRefObject或序列化 - 会更昂贵?

Mar*_*ell 8

MarshalByRefObject表示所有调用(方法,属性等)都通过线路进行代理.这可能意味着您不是一次传输数据,而是在传输的数据上本地运行多个方法等,而是在每次访问时进行网络调用.例如,多少次(每个请求)是一个角色测试?或者查询的名字?老实说,我不知道,但我猜它超过1(全部总计).加上原始设置成本......

带宽可能不会很大,但延迟非常显着,特别是如果您有分布式节点(因为您提到了云场景).

就个人而言,我会MarshalByRefObject像瘟疫一样避免,但取决于你......