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