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

时间:2011-06-28 08:01:17

标签: c# .net performance serialization marshalling

在我的Azure网络角色代码中,我有一个CustomIdentity类派生自System.Security.Principal.IIdentity。在某些时候.NET运行时tries to serialize that classserialization wouldn't work。试图解决我搜索过的问题并找到this answer并尝试从MarshalByRefObject继承我的课程。

现在,当我的CustomIdentity类继承自MarshalByRefObject时,不再有序列化尝试,我的代码也能运行。但是,我想知道使用MarshalByRefObject类的性能影响。

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

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

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

1 个答案:

答案 0 :(得分:8)

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

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

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