我知道在一些分布式技术(如RPC)中,使用了术语“封送”,但不理解它与序列化有何不同。它们不是都在把对象转换成一系列的比特吗?
相关:
什么是序列化?
什么是对象编组?
我知道在一些分布式技术(如RPC)中,使用了术语“封送”,但不理解它与序列化有何不同。它们不是都在把对象转换成一系列的比特吗?
相关:
什么是序列化?
什么是对象编组?
当前回答
编组实际上使用序列化过程,但主要的区别是,它在序列化中只有数据成员和对象本身被序列化,而不是签名,但在编组对象+代码库(其实现)也将被转换为字节。
编组是使用JAXB将java对象转换为xml对象的过程,以便可以在web服务中使用它。
其他回答
两者都做一件共同的事情——序列化一个对象。序列化用于传输对象或存储对象。但是:
序列化:当你序列化一个对象时,只有该对象中的成员数据被写入字节流;不是那个代码 实际上实现了对象。 编组:当我们谈论将对象传递给远程对象(RMI)时,会使用编组这个术语。在编组中,对象被序列化(成员数据被序列化)+代码库附加。
因此序列化是编组的一部分。
CodeBase是告诉Object的接收者该对象的实现可以在哪里找到的信息。任何认为自己可能会将一个对象传递给另一个之前可能没有见过它的程序的程序,都必须设置代码库,以便如果接收方在本地没有可用的代码,可以知道从哪里下载代码。在反序列化对象时,接收方将从中获取代码库并从该位置加载代码。
编组是告诉编译器数据将如何在另一个环境/系统上表示的规则; 例如;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string cAlternateFileName;
正如您可以看到的,两个不同的字符串值表示为不同的值类型。
序列化将只转换对象内容,而不是表示(将保持不变)并遵守序列化规则(导出什么或不导出什么)。例如,私有值将不会被序列化,公共值是,对象结构将保持不变。
编组通常在相对紧密关联的进程之间进行;序列化不一定有这种期望。因此,当在进程之间编组数据时,例如,您可能希望仅发送一个引用到可能昂贵的数据以进行恢复,而使用序列化时,您可能希望保存所有数据,以便在反序列化时正确地重新创建对象。
可以把它们看作同义词,它们都有一个生产者,把东西发送给消费者……在实例的结束字段被写入一个字节流,而另一端则将相同的实例反向和向上写入。
注意:java RMI还支持从接收端传输缺少的类…
我认为主要的区别在于编组应该也涉及到代码库。换句话说,您将无法将对象编组或反编组到不同类的状态等效实例中。
序列化只是意味着您可以存储对象并重新获得等效的状态,即使它是另一个类的实例。
也就是说,它们通常是同义词。