什么是编组? 什么时候发生了什么事情?

我知道这个问题已经被问到,至less在这里 。

但是没有一个满意的答案,至less不是我。 关于与非托pipe代码互操作的编组有很多讨论,但是从一个线程到另一个线程的编组又如何呢?

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

6 Solutions collect form web for “什么是编组? 什么时候发生了什么事情?”

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

如果这些数据如果任意复杂,应该如何发送消息?

编组是将数据字段或整个相关结构集合转换为可以在消息中发送的序列化string的过程。 要编组一个二进制数字,如果消息格式必须是文本,可以将其转换为hex数字string。 如果该消息将携带二进制数据,则该二进制数可能被转换成4个小端规范化的二进制字节并以此方式发送。 指针更难; 通常必须将它们转换成与实际存储位置无关的抽象引用(例如“节点号”)。

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

通常在库中有(非)编组例程用于实现这个目的,甚至有时候甚至会有制造工具来制造(非)编组程序发送/接收数据所需的所有调用。

编组采用某种forms的数据,并将其转换为单独的forms。 这是一个非常通用的术语,在许多意义上有细微差别的地方使用。

例如,在.NET中,当您使用本机types时,互操作层将来自.NETtypes的数据“编组”为适当的forms,以调用本机方法,然后“归集”结果。

至于线程之间的“编组” – 通常,你需要让代码在不同于当前线程的线程上运行。 例如,如果您使用Windows窗体,则不能更改线程池线程上的UI元素,因此您需要将该调用“封送”回UI线程。 这是通过创build委托,并通过Control.Invoke传递给用户界面线程(它使用一个相当复杂的系统将其返回到适当的同步上下文),然后运行委托在用户界面为你的线程。

维基百科的定义其实很不错。

编组的概念和“序列化”是一样的:从一个内存表示(从某种意义上说,根本不表示任何表示 – 当某个内存中的东西只是“存在”)到一个“硬拷贝“表示,不pipe是XML还是二进制stream等。 然而,根据你在做什么,它也可能意味着某种转换或翻译到目标格式。

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

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

我理解封送处理的方式是,它为您提供了一种方式,可以在各种操作环境中以一致的方式传输数据。

在从托pipe代码到非托pipe代码封送数据的上下文中,它或多或less是相同的。

我有一些数据,说一个整数数组或任何我select的数据types,我想在我的C ++代码做一些操作之后,在我的C#代码中使用它。

我不能只是说“嘿,这是arrays的位置,做你想要的”C#代码。 C ++中的整数数组可能无法以与C#中相同的方式存储。 封送让我们以独立于环境的方式传输这些数据,这样任何一方都能以同样的方式看到数据。

另一个例子是networking。 您通常不会调用这个封送处理,但是如果您想通过networking传输它,您通常必须传输它,以便接收它的任何人都可以像您那样解释数据。 您的计算机可以以小端顺序表示数据,另一端可以按大端顺序表示。

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

来自Wikipedia – 编组(计算机科学) :

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

在.NET中调用非托pipe函数的情况下,使用编组将数据转换为非托pipe函数可以使用的数据。 例如, System.String是基于Unicode的,但该string可能需要转换为ANSIstring才能传递到非托pipeC函数。

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

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

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

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

所以这意味着你正在按照你想要的方式排列数据。 通常这是XML格式。

  • 在循环中执行余数操作的Java线程会阻塞所有其他线程
  • unit testingmultithreading应用程序?
  • 如何正确closuresjava的ExecutorService
  • 为什么在没有“Thread.sleep”的情况下,“while(true)”会在Linux上导致100%的CPU使用率,而不是在Windows上使用?
  • 如何从C#中的另一个线程更新GUI?
  • multiprocessing.Pool:何时使用apply,apply_async或map?
  • 如何阐明asynchronous和并行编程之间的区别?
  • Java中的监视器是什么?
  • 暂停/停止并继续启动/恢复Java TimerTask?
  • 用户级和内核支持的线程之间的区别?
  • 在主UI线程上的.NET中引发事件