我知道在一些分布式技术(如RPC)中,使用了术语“封送”,但不理解它与序列化有何不同。它们不是都在把对象转换成一系列的比特吗?

相关:

什么是序列化?

什么是对象编组?


当前回答

序列化vs编组

问题:对象属于某个进程(VM),其生命周期是相同的

序列化-将对象状态转换为字节流(JSON, XML…)用于保存,共享,转换…

编组-包含序列化+代码库。它通常用于远程过程调用(RPC) -> Java远程方法调用(Java RMI),在这里您可以调用托管在远程Java进程上的对象的方法。

codebase -是类定义的一个地方或URL,它可以被ClassLoader下载。CLASSPATH[About]作为一个本地代码库

JVM -> Class Loader -> load class definition
java -Djava.rmi.server.codebase="<some_URL>" -jar <some.jar>

非常简单的RMI图

Serialisation - state
Marshalling - state + class definition

官方文档

其他回答

我对编组的理解与其他答案不同。

序列化:

利用约定制作或补充对象图的有线格式版本。

编组:

利用映射文件制作或补充对象图的有线格式版本,以便可以自定义结果。该工具可以从遵循约定开始,但重要的区别在于自定义结果的能力。

合同优先开发:

编组在合同优先开发的上下文中很重要。

可以对内部对象图进行更改,同时保持外部接口的稳定。这样,所有的服务订阅者就不必为每个微不足道的更改而修改。 可以将结果映射到不同的语言。例如,从一种语言的属性名称约定('property_name')到另一种语言('propertyName')。

编组通常在相对紧密关联的进程之间进行;序列化不一定有这种期望。因此,当在进程之间编组数据时,例如,您可能希望仅发送一个引用到可能昂贵的数据以进行恢复,而使用序列化时,您可能希望保存所有数据,以便在反序列化时正确地重新创建对象。

在远程过程调用的上下文中,封送处理和序列化大体上是同义的,但在语义上就意图而言是不同的。

特别地,封送处理是关于从这里到那里获取参数,而序列化是关于将结构化数据复制到字节流等基本形式或从中复制。在这个意义上,序列化是执行封送处理的一种方法,通常实现值传递语义。

也可以通过引用封送对象,在这种情况下,“在线上”的数据只是原始对象的位置信息。但是,这样的对象仍然可以接受值序列化。

正如@Bill提到的,可能会有额外的元数据,比如代码基位置,甚至是对象实现代码。

封送处理是指将函数的签名和参数转换为单字节数组。 专门用于RPC的目的。

序列化通常是指将整个对象/对象树转换为字节数组 封送处理将序列化对象参数,以便将它们添加到消息中并通过网络传递。 序列化也可以用于存储到磁盘

可以把它们看作同义词,它们都有一个生产者,把东西发送给消费者……在实例的结束字段被写入一个字节流,而另一端则将相同的实例反向和向上写入。

注意:java RMI还支持从接收端传输缺少的类…