什么是编组?什么东西被“编组”会发生什么?

时间:2011-04-08 21:06:02

标签: .net multithreading marshalling definition language-interoperability

我知道这个问题至少被提出here

但是没有一个令人满意的答案,至少对我没有。关于与非托管代码的互操作,有很多关于编组的讨论,但是从一个线程到另一个线程的编组呢,就像我们在.NET中必须做的那样。

这让我问,什么是编组,真的吗?当你给出编组的定义时,你如何定义它以便解释互操作性的情况,以及你在线程之间“编组”的情况?

6 个答案:

答案 0 :(得分:82)

计算通常需要将数据从一个站点移动到另一个站点,并且没有任何共享内存。因此,一个计算将包含数据的消息发送给另一个。

如果数据是任意复杂的,那么该消息应该如何发送?

编组是将数据字段或整组相关结构转换为可在消息中发送的序列化字符串的过程。编组二进制文件 如果消息格式必须是文本,则可以将其转换为十六进制数字字符串。如果消息将携带二进制数据,则二进制数可能被转换为4个小端标准化二进制字节并以此方式发送。指针更难;通常必须将它们转换为独立于实际存储位置的抽象引用(例如,“节点号”)。

当然,如果你“编组”数据,你必须最终“解组”,这是读取串行流和重建传输数据(结构)的过程。

通常在库中有(un)编组例程用于实现此目的,有时甚至有工具可以制作(un)编组例程所需的所有调用以发送/接收数据。 / p>

答案 1 :(得分:29)

编组正在采集某种形式的数据,并将其翻译成单独的形式。这是一个非常通用的术语,在许多地方使用,意义上有细微差别。

例如,在.NET中,当您使用本机类型时,互操作层会将您的数据从.NET类型“编组”到适当的表单中以调用本机方法,然后将结果“编组”回来。 / p>

至于线程之间的“编组” - 通常,您需要让代码在与当前线程不同的线程上运行。例如,如果您使用的是Windows窗体,则无法更改线程池线程上的UI元素,因此您需要将调用“封送”回UI线程。这是通过创建委托,并通过Control.Invoke(使用相当复杂的系统将其发回到正确的同步上下文)将委托传递回用户界面线程来完成的,而后者又在用户界面上运行委托你的主题。

答案 2 :(得分:12)

Wikipedia's定义实际上非常好。

编组的整体概念与“序列化:”从内存表示(在某种程度上,就像根本没有表示 - 当内存中的某些内容只是“存在”)移动到“硬拷贝”表示,无论是XML还是二进制流或其他东西。但是,根据您正在做的事情,它还可能意味着某种转换或转换为目标格式。

对于进程编组:一个线程不是简单地“调用”另一个线程 - 数据必须打包并从一个线程“发送”到另一个线程。编组是打包数据的过程(例如,有关要调用的方法及其参数的数据)。

如果您在互操作方面进行编组,则将方法调用及其参数打包成一个数据结构,该数据结构可以发送到运行COM组件的进程/线程。该包需要采用COM组件可以理解的格式。

答案 3 :(得分:4)

我理解编组的方式是它为您提供了一种在各种操作环境中以一致的方式传输数据的方法。

在将数据从托管代码编组到非托管代码的上下文中,它或多或少是相同的。

我有一些数据,比如一个整数数组或我选择的任何数据类型,我希望在我的C ++代码对它进行一些操作之后,可以在我的C#代码中使用它。

我不能只对C#代码说“嘿,这就是数组的位置,做你想做的”。 C ++中的一组int可能不会以与C#中相同的方式存储。封送让我们以独立于环境的方式传输这些数据,以便任何一方以相同的方式查看数据。

另一个例子是网络。您通常不会调用此编组,但如果您想通过网络传输它,则通常必须以这样的方式传输它,即接收它的人以与您相同的方式解释数据。您的计算机可以用小端顺序表示数据,另一个可以用大端顺序表示它。

tl;博士:Marshaling为您提供了在各种操作环境中始终如一地表示数据的方法

答案 4 :(得分:4)

来自Wikipedia - Marshalling (computer science)

  

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

在从.NET调用非托管函数的情况下,编组用于将.NET的数据转换为非托管函数可以使用的数据。例如,System.String是基于Unicode的,但该字符串可能需要转换为ANSI字符串才能传递给非托管C函数。

对于线程,编组通常是指将某些数据的所有权从一个线程转移到另一个线程。例如,程序有两个线程。第一个线程从网络读取数据,第二个线程计算该数据。在网络线程读取一些数据之后,它将数据传输(即“编组”)到计算线程以进行处理。它可以通过将数据写入两个线程之间共享的队列来实现。

线程编组几乎总是涉及正在编组的数据的同步。

答案 5 :(得分:1)

它通常用于“以XML格式编写”的上下文中,但它可以编组为任何格式。

2.  To arrange, place, or set in methodical order.
   (from American Heritage® Dictionary of the English Language)

因此,这意味着您要按照您想要的有条理的顺序/格式排列数据。通常这是XML格式。