串行化是必须的,以便通过线路传输数据吗?

时间:2010-11-14 03:35:52

标签: c# java python c

以下是我读过的内容,并且想知道该陈述是否属实。

  

序列化是一个过程   转换数据结构或对象   进入一系列位,以便它可以   存储在文件或内存缓冲区中,   或通过网络传输   连接链接“复活”   稍后在同一台或另一台计算机上   环境。[1]当结果   系列的位被重新读取   序列化格式,它可以   用于创建语义   相同的原始克隆   宾语。对于许多复杂的物体,例如   作为那些广泛使用的   参考,这个过程不是   简单。

11 个答案:

答案 0 :(得分:6)

序列化只是描述当你想要传输某个数据结构,类等时你所做的事情的一种奇特方式。

例如,假设我有一个结构:

struct Color
{
    int R, G, B;
};

当您通过网络传输时,您不会说发送颜色。您创建一行位并发送它。我可以创建一个unsigned char *并连接R,G和B然后发送它们。我刚做序列化

答案 1 :(得分:4)

需要某种序列化,但这可以采取多种形式。它可以是dotNET序列化,由语言处理,也可以是自定义构建的格式。也许是一系列字节,其中每个字节代表一些“神奇的价值”,只有你和你的应用才能理解。

例如,在dotNET中,我可以创建一个具有单个字符串属性的类,将其标记为可序列化,并且dotNET框架可以处理其他所有内容。

我还可以构建自己的自定义格式,其中前4个字节表示要发送的数据的长度,所有后续字节是字符串中的字符。但当然你需要担心字节排序,unicode和ansi编码等等。

通常,您可以更轻松地使用您的语言/ OS / dev框架使用的任何框架,但这不是必需的。

答案 2 :(得分:3)

是的,序列化是通过网络传输数据的唯一方法。考虑序列化的目的是什么。您可以定义类的存储方式。在内存中,你无法准确知道课程的每个部分的位置。特别是如果你有一个列表,如果它已经提前分配但然后重新分配,它可能会在整个地方被分割,所以它不是一个连续的内存块。你如何通过线路发送这个支离破碎的类?

就此而言,如果您通过电汇发送List<ComplexType>,它如何知道每个ComplexType的开始和结束位置。

答案 3 :(得分:2)

  

序列化是必须的,以便通过网络传输数据吗?

字面意思没有。

可以想象,您可以将数据从一个地址空间移动到另一个地址空间而无需将其序列化。例如,使用分布式虚拟内存的假设系统可以通过发送页面将数据/对象从一台机器移动到另一台机器......而无需任何特定的序列化步骤。

在一台机器中,对象可以通过交换机页面从一个虚拟地址空间传输到另一个虚拟地址空间。

但在实践中,答案是肯定的。我不知道任何有效的主流技术。

答案 4 :(得分:1)

这里真正的问题不是越过电线,问题是在电线的另一端使用相同的语义对象。为了在不同系统之间正确传输数据 - 无论是通过TCP / IP,软盘还是打卡 - 数据必须编码(序列化)为独立于平台的表示。

由于对齐和类型大小问题,如果您尝试对对象进行直接二进制传输,则会导致未定义的行为(借用C / C ++标准中的定义)。

例如,long datatype的大小和对齐方式可能因架构,平台,语言甚至同一编译器的不同构建而不同。

答案 5 :(得分:0)

对于比原始或同类原语更复杂的东西,是的。

答案 6 :(得分:0)

二进制序列化不是唯一的选择。例如,您还可以将对象序列化为XML文件。或者作为JSON。

答案 7 :(得分:0)

我认为你问的是错误的问题。序列化是计算机编程中的一个概念,某些要求必须满足才能被视为序列化机制。

任何准备数据的方法,使得它可以以这样的方式传输或存储:另一个程序(包括但不限于另一个系统上或另一个时间的同一程序的另一个实例)可以读取数据并重新实例化数据所代表的任何对象。

注意我在那里放了“对象”一词。如果我编写一个程序,在文件中存储一堆文本;我后来使用了一些其他程序,或者第一个程序的某个实例来读取该数据......我还没有真正使用过“序列化”机制。如果我以这样的方式编写文本,那么文本也会存储一些关于它是如何被操纵的状态......这可能需要序列化。

该术语主要用于表达行为和状态的活动组合被呈现为可由另一个程序/实例读取并实例化的形式的概念。大多数序列化机制都绑定到特定的编程语言或虚拟机系统(在Java VM,C#VM等意义上;不在“VMware”虚拟机的意义上)。 JSON(和YAML)是一个值得注意的例外。它们表示具有相当接近的对象类的数据,这些对象类具有相当类似的语义,因此它们可以以有意义的方式在多种不同的编程语言中实例化。

并非所有数据传输或存储都需要“序列化”......存储和传输数据的某些方式可用于序列化。在列表中,必须能够消除编程语言支持的数据类型之间的歧义。如果它读取:1必须知道该文本或整数或实数(相当于1.0)还是一点。

答案 8 :(得分:0)

严格来说,它不是唯一的选项;你可以提出“远程”符合文本意义的论点;这里在接收器上创建一个伪对象,其中包含无状态。拦截所有调用(方法,属性等),仅传输调用结果。这样可以避免传输对象本身的需要,但如果涉及过度“繁琐”的使用(即很多调用)会因为光速的延迟(加起来)而变得非常昂贵。

然而,“远程”现在已经过时了。大多数情况下,是的:对象需要以某种方式序列化和反序列化(这里有 lot 选项)。那段话非常正确。

答案 9 :(得分:0)

将消息作为对象并序列化为字节是理解和管理通过线路传输的内容的更好方法。在过去,协议和数据要简单得多,程序员通常只将字节放入输出流。通过众所周知的简单规范来分享共同的理解。

答案 10 :(得分:0)

我想说序列化需要将对象存储在文件中以实现持久性,但是当我们反序列化时,需要在对象中动态分配指针,但是传输的序列化取决于物理协议和使用的机制,例如,如果我使用UART传输数据然后逐位串行化,但如果我使用并行端口,那么8位一起传输,这不是序列化的