什么是对象编组?

时间:2008-09-30 17:49:11

标签: marshalling terminology glossary

我听过这个经常使用的概念,但我对它的内容并没有很好的把握。

10 个答案:

答案 0 :(得分:34)

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

Wikipedia's description

答案 1 :(得分:33)

我不同意,维基百科对此很清楚。

  

在计算机科学,编组   (类似于序列化)是   改变记忆的过程   将对象表示为数据   格式适合存储或   传输。通常使用它   何时必须在数据之间移动   计算机程序的不同部分   或从一个程序到另一个程序。

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

答案 2 :(得分:10)

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

远程过程调用使用编组。在调用远程函数时,您必须将参数编组为某种标准格式,以便可以通过网络传输。

答案 3 :(得分:4)

我澄清了谷歌搜索“数据编组”,第一次点击是on some place called webopedia非常好。要点是,您可以来回转换数据,以便通过网络传输。它解决的问题是您无法通过网络以程序可用的形式传输数据。您必须解决许多问题,包括数据的字节顺序,如何存储字符串等复杂数据类型等。

编组不仅可以解决网络传输问题,还可以解决其他问题,例如从一个架构转到另一个架构,可能是不同的语言,尤其是那些可能使用虚拟机和其他“翻译”问题的语言。

答案 4 :(得分:4)

Marshalling是将对象的内存表示转换为可以存储或传输的数据格式的过程。它也被称为serialization(尽管在某些情况下可能会有所不同)。对象的内存表示可以存储为二进制或XML或任何适合存储和/或传输的格式,允许您解组并获取原始对象。

对于一个使用示例,如果您有一些带有客户端和服务器组件的在线游戏,并且您想要将包含玩家统计数据和世界坐标的玩家对象从客户端发送到服务器(或者相反),可以简单地在客户端编组它,通过网络发送它,并在另一端解组它,它会在服务器上显示,好像该对象是在服务器本身上创建的。这是一个红宝石的例子:

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

答案 5 :(得分:3)

编组是跨应用程序边界或不同数据格式之间传输数据的过程。编组很常见,例如将数据写入磁盘或数据库在技术上是编组,但该术语倾向于用于描述“外部”API或进程间通信的数据转换。

例如,在.NET中,托管代码和非托管代码之间的通信(例如访问某些win32 API)可能需要编组才能在托管C#对象和C / C ++样式对象(结构,句柄,输出缓冲区等。)静态Marshal class的帮助可能会有所帮助。

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

编组是c ++中的本机类型(HTMLElementconst wchar_t*)和c ++中的虚拟机库使用的内部运行时表示形式(JSObject,{{1} }等)表示虚拟机(MonoStringHTMLElement)上运行的JS / C#等脚本可见的虚拟类型/托管类型。 P/Invoke performs automatic marshalling。使用P / Invoke将System.String传递到本地呼叫会导致System.String在自动编组时发生传递到本地呼叫。但是,当您使用内部调用时,它将作为const wchar_t*传递,c ++函数将必须先对其进行封送处理,然后封送处理以返回内部运行时返回类型所需的所有内容。使用内部调用时,无需整理数据类型,例如int(即MonoString作为System.Int32传递,而gint32只是{{1} }。