什么是对象编组?

时间:2020-03-06 14:56:13  来源:igfitidea点击:

我听说过这个概念经常使用,但是我对它的概念并不十分了解。

解决方案

抱歉,维基百科对此很清楚。

In computer science, marshalling
  (similar to serialization) is the
  process of transforming the memory
  representation of an object to a data
  format suitable for storage or
  transmission. It is typically used
  when data must be moved between
  different parts of a computer program
  or from one program to another.

http://en.wikipedia.org/wiki/Marshalling_(computer_science)

这意味着将任何数据转换为另一种数据类型以传输到另一系统。

例如,将结构编组到XML文档中以发送到Web服务,或者编组指针以发送到其他线程单元。

从编程的非常普通的意义上讲,它只是意味着以一种格式获取数据并将其转换为其他子系统可以接受的格式。

将内存中的对象转换为可以写入磁盘或者通过电线发送的格式等。

维基百科的描述。

我澄清了一个谷歌搜索"数据编组",第一击是在一个叫做webopedia的地方,这是相当不错的。要点是,我们可以将数据来回转换为某种形式,例如通过网络进行传输。它解决的问题是,我们不能真正以程序可用的形式在网络上传输数据。我们必须解决许多问题,包括数据的字节序,如何存储诸如字符串之类的复杂数据类型等。

编组不仅解决网络传输问题,还解决其他问题,例如从一种体系结构过渡到另一种体系,可能是不同的语言,尤其是可能使用虚拟机之类的语言,以及其他"翻译"问题。

编组是将对象的内存表示形式转换为可以存储或者传输的数据格式的过程。这也称为序列化(尽管在某些情况下可能有所不同)。对象的内存表示形式可以二进制或者XML的形式存储或者适合存储和/或者传输的任何格式,以使我们可以解组并将原始对象取回。

作为用法示例,如果我们有一些包含客户端和服务器组件的在线游戏,并且想要将包含玩家统计信息和世界坐标的玩家对象从客户端发送到服务器(或者相反),则可以简单地编组它在客户端,通过网络发送,然后在另一端解组,它对于服务器来说就像在服务器上创建对象一样。这是一个红宝石示例:

srcplayer = Player.new
# marshal (store it as string)
str = Marshal.dump(srcplayer)
#unmarshal (get it back)
destplayer = Marshal.load(str)

基本上,这是一个将对象(或者类似对象)一般转换为另一种表示形式的表达式,该表示形式可以通过电线发送或者存储到磁盘(通常为字符串或者二进制流。相反的解组,描述了读取编组的相反方向)表示并重新创建对象或者任何较早存在的内存结构。

当前的另一个日常示例是JSON

封送处理是跨应用程序边界或者在不同数据格式之间传输数据的过程。封送非常普遍,例如在技术上将数据写入磁盘或者数据库是封送,但是该术语往往用于描述"外部" API或者进程间通信的数据转换。

例如,在.NET中,托管和非托管代码之间的通信(例如访问某些win32 API)可能需要进行编组,以便在托管Cobject和C / C ++样式对象(结构,句柄,输出缓冲区等)之间来回转换。 。)静态元帅课程的帮助可能会有所帮助。

人们已经非常清楚地定义了编组,所以我将跳过该定义并跳到一个示例。

远程过程调用使用编组。调用远程功能时,必须将参数编组为某种标准格式,以便可以在网络上进行传输。