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

在我的Azure Web角色代码中,我有一个派生自System.Security.Principal.IIdentityCustomIdentity类。 在某些时候,.NET运行时尝试序列化该类,并且序列化将不起作用 。 试图解决我搜索了很多并找到了这个答案,并试图从MarshalByRefObjectinheritance我的类。

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

我的代码就像这样运行。 首先,请求进入IIS并传递给身份validation代码,该代码创建CustomIdentity实例并将该实例附加到HTTP上下文。 然后一段时间后,相同的HTTP上下文被传递给ASP.NET处理程序,该处理程序最多访问一次CustomIdentity实例。 CustomIdentity对象在请求期间存在,然后被销毁。

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

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

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

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

就个人而言,我会像瘟疫一样避免MarshalByRefObject ,但是由你决定……