什么是对象编组?
我听过这个经常使用的概念,但是我没有很好的把握它是什么。
将内存中的对象转换为可写入磁盘或通过线路发送的格式
维基百科的描述 。
我不同意,维基百科对此很清楚。
在计算机科学中,编组(类似于序列化)是将对象的存储器表示转换成适合于存储或传输的数据格式的过程。 当数据必须在计算机程序的不同部分之间或从一个程序到另一个程序之间移动时,通常使用它。
http://en.wikipedia.org/wiki/Marshalling_(computer_science);
人们已经很清楚地定义了编组,所以我将跳过定义并跳转到示例。
远程过程调用使用编组。 当调用远程函数时,你将不得不将参数集中到某种标准格式,以便通过networking进行传输。
我澄清了一个谷歌search“数据编组”,第一个命中是在一个叫webopedia这是相当不错的地方。 要点是,您将数据来回转换为networking传输等forms。 它解决的问题是,你不能通过一个程序可用的forms通过networking传输数据。 你必须解决一些问题,如数据的字节顺序,如何存储复杂的数据types,如string等。
编组不仅是为了解决networking传输问题,还有其他问题,如从一个架构到另一个架构,可能是不同的语言,尤其是那些可能使用虚拟机的东西,以及其他“翻译”问题。
编组是将对象的内存表示转换为可以存储或传输的数据格式的过程。 这也被称为序列化 (虽然在某些情况下可能会有所不同)。 对象的内存表示可以以二进制或XML或任何适合存储和/或传输的格式进行存储,这种方式允许您对其进行解组并取回原始对象。
举一个例子,如果你有一个在线游戏与一个客户端和服务器组件,你想发送包含玩家统计数据和世界坐标从客户端到服务器(或相反方向)的玩家对象,你可以简单的元帅它在客户端,通过networking发送,并在另一端解组,它将出现在服务器上,就好像该对象是在服务器上创build的一样。 这是一个ruby的例子:
srcplayer = Player.new # marshal (store it as string) str = Marshal.dump(srcplayer) #unmarshal (get it back) destplayer = Marshal.load(str)
编组是在应用程序边界或不同数据格式之间传输数据的过程。 编组是非常常见的,例如将数据写入磁盘或数据库在技术上是编组,但是这个术语往往被用来描述“外部”API或进程间通信的数据转换。
例如,在.NET中,托pipe和非托pipe代码(如访问某些win32 API)之间的通信可能需要编组,以便在托pipeC#对象和C / C ++样式对象(结构,句柄,输出缓冲区,等等)对于静态的元帅类的帮助可能会有所帮助。
基本上,它是一个expression式,用于将对象(或类似对象)一般转换为另一种表示forms(例如)可以通过networking发送或存储到磁盘(通常是string或二进制stream)。相反的解组描述了读取编组的相反方向表示和重新创build一个对象或先前存在的任何内存结构。
另一个当前日常的例子是JSON
在编程中的一个非常普遍的意义上,它仅仅意味着采用一种格式的数据并将其转换成其他子系统可以接受的格式。
这意味着将任何数据转换为另一种数据types以转移到另一个系统。
例如,将一个结构编组到一个XML文档中发送到web服务,或编组指针发送到不同的线程单元。