61

我经常听到这个概念,但我并没有很好地理解它是什么。

4

10 回答 10

41

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

维基百科的描述

于 2008-09-30T17:52:43.520 回答
37

我不敢苟同,维基百科对此非常清楚。

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

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

于 2008-09-30T17:51:38.170 回答
13

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

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

于 2008-09-30T18:59:04.513 回答
6

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

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

srcplayer = Player.new
# marshal (store it as string)
str = Marshal.dump(srcplayer)
#unmarshal (get it back)
destplayer = Marshal.load(str)
于 2008-09-30T17:57:06.737 回答
4

我将谷歌搜索澄清为“数据编组”,第一次点击是在一个名为 webopedia 的地方,这非常好。要点是您将数据来回转换为一种形式,以便通过网络传输。它解决的问题是您不能真正通过网络以程序可用的形式传输数据。您必须解决许多问题,包括数据的字节顺序、如何存储复杂的数据类型(如字符串)等。

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

于 2008-09-30T17:55:26.977 回答
4

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

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

于 2008-09-30T18:20:28.570 回答
2

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

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

于 2008-09-30T17:52:23.050 回答
2

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

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

于 2008-09-30T17:57:16.580 回答
1

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

于 2008-09-30T17:52:36.577 回答
1

编组是跨 ABI 边界调用时需要进行的调用参数转换。边界可能在COM客户端和COM服务器之间,其中COM客户端的ABI的类型需要通过COM库编组为COM二进制的ABI(在COM中,编组也可以指在同一进程中跨越单元边界时所需的参数到要发送到所属线程的消息队列以由 COM 窗口过程处理和解组的消息格式,并且在跨越进程边界的情况下,附加的由 COM 代理编组到 RPC/LPC 的步骤,即将 LPC 消息发送到 LPC 端口)。

第二种情况的一个例子是 Mono .NET。您可以从非托管(本机)代码(C++,不由虚拟机库管理,而是由虚拟机库管理和运行,由内部对象和结构表示)调用托管代码(高级语言)链接到库),并且您还可以在使用虚拟机库 API 设置虚拟机时基于 C++ 代码进行的内部绑定执行从 C# 到非托管(本机)代码 (C++) 的本机调用。例如,System.String在 C# 中,内部由MonoString.MonoString是一个使用 C++ ABI 的 C++ 对象,但与标准使用方式以及本机代码如何期望字符串类型的参数在 ABI 中表示的方式不同,因为 VM 库已使用逻辑实现了自己的 ABI C++ ABI 的某种安排——装在 C++ 类型的对象中,MonoString*而不是const wchar_t*. System.String使用 P/Invoke(执行自动编组)将 a传递const wchar_t*给 C# 中的本机调用会导致在发生自动编组时将 a 传递给本机调用。但是,当您使用内部调用时,它将作为MonoString*,C++ 函数必须对自身进行编组,然后对返回到 VM 逻辑 ABI 类型所需的任何内容进行编组。只有 blittable 类型在使用内部调用时不需要编组,例如,int它是 aSystem.Int32被传递为 a gint32,它只是一个int.

另一个例子是Spidermonkey JS 引擎,它在 C++ 原生类型HTMLElement和内部运行时表示之间编组JSObject,它表示HTMLElementjavascript 中的类型。

于 2020-04-25T13:48:30.737 回答