我知道,在多个分布式技术(如RPC)的术语,术语“编组”使用,但不明白它是从序列化的不同之处。 难道他们都转化成对象一系列的位?
有关:
什么是序列化?
什么是对象编组?
我知道,在多个分布式技术(如RPC)的术语,术语“编组”使用,但不明白它是从序列化的不同之处。 难道他们都转化成对象一系列的位?
什么是序列化?
什么是对象编组?
编组序列化是在远程过程调用的情况下松散的代名词,而是意图的问题语义不同。
特别地,编组是有关获取参数从这里到那里,而串行化是关于结构化数据复制到或从原始的形式,例如作为字节流。 在这个意义上,序列是一个单元进行编组,通常是通过执行按值语义。
另外,也可以用于其目的在于通过引用编组,在这种情况下“在电线上”的数据只是为原始对象的位置信息。 然而,这样的对象可能仍然适合于值序列化。
如@Bill提及,可能有额外的元数据,诸如代码基础位置或甚至对象实现代码。
无论做一个共同点-那就是序列化对象。 序列化是用来转移对象,或者存储它们。 但:
所以序列化是编组的一部分。
代码库 ,告诉对象的接收器,其中该对象的实现可以找到的信息。 任何计划,认为它可能永远传递一个对象可能没见过它之前必须设置代码库,从而使接收器可以知道从哪里下载的代码,如果没有可用的本地代码另一个程序。 接收器将,在反序列化对象,取从它代码库,并从该位置加载的代码。
从编组(计算机科学),维基百科的文章:
术语“元帅”被认为是在Python标准库“连载”的代名词1 ,但条件是不能在与Java相关的RFC 2713的代名词:
到“编组”的对象是指,当编组对象是“解组”,是通过自动加载对象的类定义获得的原始对象的一个副本,可能这样的方式来记录它的状态和基本代码(一个或多个)。 你可以封送任何对象,序列化或远程。 编组站就像系列化,除了编组也记录代码库。 编组站是在编组对待远程对象特地从系列化不同。 (RFC 2713)
“串行化”的对象是指将其状态转换成字节流以这样的方式,该字节流可以被转换回对象的一个副本。
因此,编组也节省除了其状态字节流中的对象的代码 。
我认为,主要区别是,据说编组站也涉及到代码库。 换句话说,你将无法进行编组和解组对象分成不同的类的状态相当于实例。 。
序列化只是意味着你可以存储对象和reobtain等效的状态,即使它是另一个类的一个实例。
话虽这么说,他们通常是同义词。
编组指函数的签名和参数转换成一个单一的字节数组。 专门为RPC的目的。
序列化更经常是指将整个对象/对象树到字节数组 编组将依次将它们添加到所述消息,并通过网络传递序列化对象的参数。 *序列化也可以用于存储到磁盘。*
编组站是规则告诉编译器如何的数据将在另一个环境/系统来表示; 例如;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string cAlternateFileName;
你可以看到两个不同的字符串值表示为不同的值类型。
序列化只会转换的对象内容,不表示(将保持相同),并服从系列化的规则,(什么出口或无)。 例如,私人值将不被序列化,公共价值是客体结构将保持不变。
编组通常相对紧密相关的进程之间是; 序列化不一定有预期。 所以编组进程之间的数据时,例如,您可能希望只发送参考潜在昂贵的数据恢复,而与系列化,你会想保存这一切,反序列化时正确重建对象(或多个)。
下面是两个更具体的例子:
序列化实施例:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef struct {
char value[11];
} SerializedInt32;
SerializedInt32 SerializeInt32(int32_t x)
{
SerializedInt32 result;
itoa(x, result.value, 10);
return result;
}
int32_t DeserializeInt32(SerializedInt32 x)
{
int32_t result;
result = atoi(x.value);
return result;
}
int main(int argc, char **argv)
{
int x;
SerializedInt32 data;
int32_t result;
x = -268435455;
data = SerializeInt32(x);
result = DeserializeInt32(data);
printf("x = %s.\n", data.value);
return result;
}
在串行化,数据以可以存储和非平坦后的方式压平。
编组演示:
(MarshalDemoLib.cpp)
#include <iostream>
#include <string>
extern "C"
__declspec(dllexport)
void *StdCoutStdString(void *s)
{
std::string *str = (std::string *)s;
std::cout << *str;
}
extern "C"
__declspec(dllexport)
void *MarshalCStringToStdString(char *s)
{
std::string *str(new std::string(s));
std::cout << "string was successfully constructed.\n";
return str;
}
extern "C"
__declspec(dllexport)
void DestroyStdString(void *s)
{
std::string *str((std::string *)s);
delete str;
std::cout << "string was successfully destroyed.\n";
}
(MarshalDemo.c)
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(int argc, char **argv)
{
void *myStdString;
LoadLibrary("MarshalDemoLib");
myStdString = ((void *(*)(char *))GetProcAddress (
GetModuleHandleA("MarshalDemoLib"),
"MarshalCStringToStdString"
))("Hello, World!\n");
((void (*)(void *))GetProcAddress (
GetModuleHandleA("MarshalDemoLib"),
"StdCoutStdString"
))(myStdString);
((void (*)(void *))GetProcAddress (
GetModuleHandleA("MarshalDemoLib"),
"DestroyStdString"
))(myStdString);
}
在编组中,数据不一定必须以进行整平,但它需要被转换成另一个替换表示。 所有铸件编组,但并非所有的封送处理是铸造。
整编并不需要动态分配的参与,也可以只是结构之间的转换。 例如,你可能有一对,但功能预计对的第一和第二元素是周围的其他方式; 您铸造/ memcpy的一对到另一不会做的工作,因为FST和苏州高新区将得到翻转。
#include <stdio.h>
typedef struct {
int fst;
int snd;
} pair1;
typedef struct {
int snd;
int fst;
} pair2;
void pair2_dump(pair2 p)
{
printf("%d %d\n", p.fst, p.snd);
}
pair2 marshal_pair1_to_pair2(pair1 p)
{
pair2 result;
result.fst = p.fst;
result.snd = p.snd;
return result;
}
pair1 given = {3, 7};
int main(int argc, char **argv)
{
pair2_dump(marshal_pair1_to_pair2(given));
return 0;
}
编组的概念变成当你开始处理多种类型的标签联合尤为重要。 例如,你可能会发现它很难得到一个JavaScript引擎打印“C字符串”为你,但你可以要求它打印封装的C字符串为您服务。 或者,如果你想打印从JavaScript运行中的字符串一个Lua或Python运行时。 他们都是字符串,但没有编组往往不会相处。
一个烦恼我最近是JScript的数组元帅C#作为“__ComObject”,并没有记录的方式与该对象玩。 我能找到的地方是地址,但我真的不知道任何关于它,所以要真正弄明白的唯一方式是它在任何可能的方式去捅,希望找到有用的信息。 因此,它变得更容易地创建一个新的对象与像一个的Scripting.Dictionary友好的界面,从JScript数组对象中的数据复制到它,这对象传递给C#,而不是JScript中的默认阵列。
test.js:
var x = new ActiveXObject("Dmitry.YetAnotherTestObject.YetAnotherTestObject");
x.send([1, 2, 3, 4]);
YetAnotherTestObject.cs
using System;
using System.Runtime.InteropServices;
namespace Dmitry.YetAnotherTestObject
{
[Guid("C612BD9B-74E0-4176-AAB8-C53EB24C2B29"), ComVisible(true)]
public class YetAnotherTestObject
{
public void send(object x)
{
System.Console.WriteLine(x.GetType().Name);
}
}
}
上述打印“__ComObject”,这是有点黑盒的从视图的C#的点。
另一个有趣的概念是,你可能有了解如何编写代码,并知道如何执行指令,所以作为一个程序员,您实际上编组你想要的电脑什么概念,从你的大脑做了程序的计算机图片。 如果我们有足够好的marshallers,我们可以只想到了什么,我们想要做的/变化,该方案将改变这种方式,而不在键盘上键入。 所以,如果你能有一种方法来存储在你的大脑的几秒钟,你真的想写一个分号的所有物理变化,你可以封送数据转换成信号打印分号,但这是一个极端。
我的编组的理解是对其他的答案不同。
连载:
生产或再水化利用公约一个对象图的线格式的版本。
编组:
以产生或通过利用一个映射文件再水化的对象图的线格式的版本,使得结果可被定制。 该工具可以通过遵守公约启动,但重要的区别是自定义的结果的能力。
契约优先的发展:
编组站是合同第一个发展的环境中很重要的。
认为他们是同义词,都具有在给消费者发送的东西制片人......在实例中的最后场被写入字节流,另一端的敌人逆ANDS了同样的情况。
NB - Java RMI的还包含运输是从收件人缺少类的支持...
编组使用序列的过程实际上但主要区别在于,它的序列化只是数据成员和对象本身获取序列化而不是签名,但在编组对象+代码库(及其实施)也将得到改造成字节。
编组站是java对象转换为使用JAXB,以便它可以在Web服务中使用XML对象的过程。