2010-11-14 17 views
5

下面是我读过的东西,想知道这个陈述是否属实。序列化是必须的,以便通过电线传输数据?

序列化是 转换数据结构或对象 成比特序列的过程,以便它可以 被存储在文件或存储器缓冲器, 或通过网络 连接链路传送到是“复活“ 后来在相同或另一台计算机 环境。[1]当根据 重新读取所得的 系列位的序列化格式时,它可以是 用于创建原语 的同义克隆对象。对于很多复杂的对象,如 与那些广泛使用 引用的对象,此过程不是直接的 。

+9

位是几乎唯一的选择,除非你使用信鸽 – 2010-11-14 03:40:03

+0

确定所以这个说法是真的吗? – user770022 2010-11-14 03:41:19

+0

@MitchWheat +1 for http://www.faqs.org/rfcs/rfc1149.html ...不要忘记旅行车的运输能力;) – jcolebrand 2010-11-14 03:42:30

回答

6

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

例如,说我有一个结构:

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

当你将本在你不说发送彩色网络。您创建一行位并发送它。我可以创建一个无符号字符*并连接R,G和B,然后发送这些。我只是做了序列化

+1

+1为例;) – jcolebrand 2010-11-14 03:47:17

0

对于任何比基元或基元的同质运行更复杂的事情,是的。

3

是的,串行化是通过线路传输数据的唯一方式。考虑序列化的目的是什么。您可以定义类存储的方式。在记忆中,你无法准确地知道班级的每一部分在哪里。特别是如果你有,例如,一个列表,如果它被提前分配,然后重新分配,它可能在整个地方被分割,所以它不是一块连续的内存块。你如何通过线路发送这个零散的课程?

对于这个问题,如果您通过电汇发送List<ComplexType>,它如何知道每个ComplexType开始和结束的位置。

4

某些类型的序列化是必需的,但这可能有多种形式。它可以是类似dotNET序列化的东西,由语言处理,也可以是定制的格式。也许是一系列字节,其中每个字节代表一些只有您和您的应用程序能够理解的“魔法值”。

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

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

通常,使用你的语言/操作系统/开发框架使用的任何框架都比较容易,但它不是必需的。

+0

+1为好答案 – jcolebrand 2010-11-14 03:48:44

0

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

+0

使用XML通过二进制 – user770022 2010-11-14 03:46:44

+0

通过网络线路有什么优势?你不能。为了存储在一个文件?可读性。 – jcolebrand 2010-11-14 03:47:52

+1

XML的优点是能够解析它的库的可用性。理论上,使用XML可以使序列化格式更容易跨平台移植。甚至有标准,如SOAP。可读性可以是一个优点,但是... XML是冗长的,因此在实践中往往不那么可读。 XML的缺点是冗长,数据量大,可能会影响性能。 – Eilistraee 2010-11-14 09:02:09

1

这里真正的问题是没有越过电线,问题最终与电线另一侧的相同语义对象结束。为了在不同的系统之间正确传输数据 - 无论是通过TCP/IP,软盘还是打卡 - 数据必须被编码(串行化)为独立于平台的表示形式。

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

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

0

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

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

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

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

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

0

严格来说它不是只有选项;你可以说“远程处理”符合文本中的含义;这里在接收器上创建一个假对象,其中包含无状态。所有呼叫(方法,属性等)都被拦截,只有调用结果被传送。这样就避免了传输对象本身的需要,但是如果涉及过度“唠叨”的使用(即多次调用),因为每个对象都具有光速的延迟(相加),可能会变得非常昂贵。

但是,“远程处理”现在已经过时了。大多数情况下,是的:对象需要以某种方式进行序列化和反序列化(这里有批次的选项)。该段非常正确。

2

是否需要序列化来传输数据?

字面上没有。

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

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

但实际上,答案是肯定的。我不知道有任何主流技术可以这样工作。

+0

取决于你的意思是“电线”。引用可能意味着固有的字节序列(文件,简单内存模型下的内存,通常API下的网络连接),因此根据定义,这些方法传输的数据将被序列化。问题是“电线” - 如果我的电线是实际的电线,我可以用绳子将一个勺子绑在它上面并将它滑到另一端。并不意味着我已经序列化勺子;-)任何激进的传输协议都会发送字节以外的内容。也许不是汤匙。 – 2010-11-14 14:03:34

+0

@Steve Jessop - 它完全取决于您如何解释短语*“将数据结构或对象转换为位序列的过程”*。我认为,在一个基于页面的方案中,这不会发生。显然没有*数据结构*或*对象*的转换,并且即使在页面级别,数据也被复制而不是从一个不同的表示转换为另一个。 – 2010-11-14 21:26:44

+0

是的,但我想知道发送一页数据“跨越网络”是什么意思。如果“穿越线”意味着通过UART或TCP/IP连接或任何类型的连接,那么无论您如何切割,您都会在某个级别将该页面表示为字节,即使您的抽象级别更高你可以谈论这个页面“只是移动”。如果你将某种物理内存从一台机器上热切换到另一台机器上,那么肯定它从来没有序列化过。它是非常并行的;-) – 2010-11-14 21:43:45

0

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

0

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

相关问题