我知道在一些分布式技术(如RPC)中,使用了术语“封送”,但不理解它与序列化有何不同。它们不是都在把对象转换成一系列的比特吗?
相关:
什么是序列化?
什么是对象编组?
我知道在一些分布式技术(如RPC)中,使用了术语“封送”,但不理解它与序列化有何不同。它们不是都在把对象转换成一系列的比特吗?
相关:
什么是序列化?
什么是对象编组?
当前回答
在远程过程调用的上下文中,封送处理和序列化大体上是同义的,但在语义上就意图而言是不同的。
特别地,封送处理是关于从这里到那里获取参数,而序列化是关于将结构化数据复制到字节流等基本形式或从中复制。在这个意义上,序列化是执行封送处理的一种方法,通常实现值传递语义。
也可以通过引用封送对象,在这种情况下,“在线上”的数据只是原始对象的位置信息。但是,这样的对象仍然可以接受值序列化。
正如@Bill提到的,可能会有额外的元数据,比如代码基位置,甚至是对象实现代码。
其他回答
我认为主要的区别在于编组应该也涉及到代码库。换句话说,您将无法将对象编组或反编组到不同类的状态等效实例中。
序列化只是意味着您可以存储对象并重新获得等效的状态,即使它是另一个类的实例。
也就是说,它们通常是同义词。
封送处理是指将函数的签名和参数转换为单字节数组。 专门用于RPC的目的。
序列化通常是指将整个对象/对象树转换为字节数组 封送处理将序列化对象参数,以便将它们添加到消息中并通过网络传递。 序列化也可以用于存储到磁盘
编组是告诉编译器数据将如何在另一个环境/系统上表示的规则; 例如;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string cAlternateFileName;
正如您可以看到的,两个不同的字符串值表示为不同的值类型。
序列化将只转换对象内容,而不是表示(将保持不变)并遵守序列化规则(导出什么或不导出什么)。例如,私有值将不会被序列化,公共值是,对象结构将保持不变。
序列化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
官方文档
编组实际上使用序列化过程,但主要的区别是,它在序列化中只有数据成员和对象本身被序列化,而不是签名,但在编组对象+代码库(其实现)也将被转换为字节。
编组是使用JAXB将java对象转换为xml对象的过程,以便可以在web服务中使用它。