是否必须序列化才能跨网络传输数据?
下面是我读到的一些内容,我在想这个说法是否正确。
序列化是一个过程,它把数据结构或对象转换成一串二进制数据,这样就可以把它存储在文件里或内存中,或者通过网络传输,以便在同一台或另一台计算机上“复活”它。当我们按照序列化的格式重新读取这串二进制数据时,就可以用它来创建一个和原始对象完全相同的副本。对于许多复杂的对象,比如那些大量使用引用的对象,这个过程并不是那么简单。
11 个回答
这里真正的问题不是数据如何传输,而是如何确保在另一端得到的对象和原来的对象是一样的。要在不同的系统之间正确地传输数据,无论是通过TCP/IP、软盘还是打孔卡,数据必须被编码(也就是序列化)成一种不依赖于平台的格式。
由于对齐和数据类型大小的问题,如果你直接以二进制形式传输你的对象,可能会导致未定义的行为(这个说法来自C/C++的标准)。
举个例子,长整型的大小和对齐方式在不同的架构、平台、编程语言,甚至同一个编译器的不同版本之间都可能有所不同。
有些情况下需要进行序列化,这个过程可以有很多种方式。比如说,像dotNET的序列化,它是由语言本身来处理的,或者你也可以自己定义一种格式。可能你会用一串字节,每个字节代表一个“魔法值”,只有你和你的应用程序能理解。
举个例子,在dotNET中,我可以创建一个只有一个字符串属性的类,把它标记为可序列化,然后dotNET框架会处理大部分的事情。
我也可以自己设计一个格式,比如前4个字节表示要发送的数据长度,后面的字节都是字符串中的字符。不过,这样的话你就得考虑字节顺序、unicode和ansi编码等问题。
通常来说,使用你所用的语言、操作系统或开发框架提供的工具会更简单,但这并不是必须的。
序列化其实就是一个花哨的说法,用来描述当你想把某种数据结构、类等发送出去时所做的事情。
举个例子,假设我有一个结构:
struct Color
{
int R, G, B;
};
当你要通过网络发送这个结构时,你不会直接说发送颜色。你需要把它变成一串二进制数据(就是0和1的组合)然后发送出去。我可以创建一个无符号字符指针(unsigned char*),把红色、绿色和蓝色的值拼接在一起,然后发送这些数据。这样一来,我就完成了序列化。