.net 代理(marshallbyref)对象的方法调用的参数是否序列化?

.net 代理(marshallbyref)对象的方法调用的参数是否序列化?,.net,serialization,marshalling,remoting,.net,Serialization,Marshalling,Remoting,我正试图围绕这一点来做正确的设计决策 假设我创建一个新的appdomain B,在其中创建一个对象O的实例,然后将对该对象的引用传递回appdomain a,以便a可以进行如下调用: O.SomeMethod(parameter) SomeMethod中的代码将在appdomain B中运行,这正是我所期望的我想知道参数和返回值会发生什么变化它们是使用binaryformatter序列化并按值传递的,还是只是在appdomains之间传递的对该数据的引用? 我希望是后者,这意味着您可以让O.S

我正试图围绕这一点来做正确的设计决策

假设我创建一个新的appdomain B,在其中创建一个对象O的实例,然后将对该对象的引用传递回appdomain a,以便a可以进行如下调用:

O.SomeMethod(parameter)
SomeMethod中的代码将在appdomain B中运行,这正是我所期望的我想知道参数和返回值会发生什么变化它们是使用binaryformatter序列化并按值传递的,还是只是在appdomains之间传递的对该数据的引用?

我希望是后者,这意味着您可以让O.SomeMethod()返回大量数据,而无需进行序列化


谢谢

传递给函数的参数需要在调用方法之前通过appdomain边界。返回值还需要通过边界(在另一个方向)

每当对象需要通过边界时,它都会:

  • 通过引用封送,如果它继承自
    MarshallByRefObject
    ;或
  • 在一侧序列化,通过边界传输,然后反序列化。如果它不是从
    MBRO
    继承,就会发生这种情况

  • 要回答您的问题,是的,参数是序列化然后反序列化的,除非它们继承自
    MBRO

    是什么让您认为BinaryFormatter没有序列化惩罚?序列化就是它所做的,二进制类型。除非参数类型来自MRBO我想你误读了我写的。在只传递引用的情况下,假设“无序列化惩罚”,因此不使用binaryformatter(或下面使用的任何东西)。让我们假设返回值是一个MBRO对象,其中包含一个10兆字节的数组。那个物体被洗过了吗?如果不是,并且主机尝试读取该数组中的字节,它是否只是从所有者appdomain将其放入的实际内存位置获取?数组不是从MBRO派生的,因此每当您访问它时,它都会被整体序列化。不管外部对象是什么。当然是这样,否则读取每个元素会非常昂贵。所以在原始数据的appdomain间通信中,没有办法避免序列化?我希望通过使用appdomains而不是进程,我可以将任意多个组件链接在一起,并在不产生潜在序列化成本的情况下传递大量数据。关于这个主题,.NET是否在场景下使用binaryformatter?这意味着appdomains之间的远程处理将比使用sockets+protobuf.net之类的东西进行进程间通信慢(在序列化时显然快10倍)!?所以如果你继续沿着MBRO链往下走,你最终会得到一堆原语,它们大概是通过值传递的?或者这些字段在共享内存中吗?不,如果传递MBRO,则其字段不会序列化。如果您对它执行某个方法,它返回的不是MBRO的内容,则会被序列化。