使用MarshalByRefObject与序列化相比有多贵?
在我的Azure Web角色代码中,我有一个派生自System.Security.Principal.IIdentity
的CustomIdentity
类。 在某些时候,.NET运行时尝试序列化该类,并且序列化将不起作用 。 试图解决我搜索了很多并找到了这个答案,并试图从MarshalByRefObject
inheritance我的类。
现在,一旦我的CustomIdentity
类从MarshalByRefObject
inheritance,就不再有序列化尝试了,我的代码也可以工作。 但是,我想知道使用MarshalByRefObject
类的性能影响。
我的代码就像这样运行。 首先,请求进入IIS并传递给身份validation代码,该代码创建CustomIdentity
实例并将该实例附加到HTTP上下文。 然后一段时间后,相同的HTTP上下文被传递给ASP.NET处理程序,该处理程序最多访问一次CustomIdentity
实例。 CustomIdentity
对象在请求期间存在,然后被销毁。
现在通过序列化,我的CustomIdentity
将序列化为流,然后从该流反序列化为新对象。 使用MarshalByRefObject
,没有序列化,但是创建了代理,并且访问将通过RPC封送到实际对象所在的位置。
在这种情况下使用MarshalByRefObject
会有多贵? 哪个MarshalByRefObject
或序列化 – 会更昂贵?
MarshalByRefObject
意味着所有调用 (方法,属性等)都通过线路进行代理。 这可能意味着您不是一次传输数据,而是在传输的数据上本地运行多种方法等,而是在每次访问时进行网络调用。 例如,多少次(每个请求)是一个角色测试? 或者查询的名字? 老实说,我不知道,但我猜它超过1(全部总计)。 加上原始设置成本……
带宽可能不会很大,但延迟非常显着,特别是如果您有分布式节点(因为您提到了云场景)。
就个人而言,我会像瘟疫一样避免MarshalByRefObject
,但是由你决定……