【问题标题】:Is serialization a must in order to transfer data across the wire?为了通过网络传输数据,序列化是必须的吗?
【发布时间】:2010-11-14 03:35:52
【问题描述】:

以下是我读到的内容,想知道这句话是否属实。

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

【问题讨论】:

  • 比特几乎是唯一的选择,除非你使用信鸽
  • 好的,所以这个说法是真的?
  • @MitchWheat +1 for faqs.org/rfcs/rfc1149.html ...别忘了旅行车的运输能力;)
  • 如果这个问题看起来和听起来很愚蠢,我很抱歉,但从我正在做的阅读来看,这似乎是必须的。我只是想要一个更有知识的人来验证我正在阅读的内容。
  • @RandyWhite30 查看您已有的 5 个答案,并要求我们中的一个或多个进一步澄清

标签: c# java python c


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      是的,序列化是通过网络传输数据的唯一方式。考虑一下序列化的目的是什么。您定义类的存储方式。在记忆中,您无法确切知道班级的每个部分在哪里。尤其是如果你有一个列表,例如,如果它被提前分配但随后被重新分配,它很可能在整个地方都是碎片化的,所以它不是一个连续的内存块。你如何通过线路发送那个碎片化的类?

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

      【讨论】:

        【解决方案4】:

        这里真正的问题不是越过网络,问题是在网络的另一端出现相同的语义对象。为了在不同系统之间正确传输数据(无论是通过 TCP/IP、软盘还是穿孔卡),必须将数据编码(序列化)为独立于平台的表示形式。

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

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

        【讨论】:

          【解决方案5】:

          为了通过网络传输数据,是否必须进行序列化?

          字面上没有。

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

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

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

          【讨论】:

          • 有点取决于你所说的“电线”是什么意思。引用可能意味着本质上是字节序列的事物(文件,简单内存模型下的内存,通常 API 下的网络连接),因此根据定义,通过这些方法传输的数据是序列化的。问题是“电线” - 如果我的电线是物理电线,我可以用绳子将勺子系在它上面并将它滑到另一端。并不意味着我已经序列化了勺子;-) 任何激进的传输协议都会发送字节以外的东西。也许不是勺子。
          • @Steve Jessop - 这取决于您如何解释短语“将数据结构或对象转换为位序列的过程”。我认为在基于页面的方案中不会发生这种情况。显然没有数据结构对象的转换,甚至在页面级别数据也被复制而不是从一种不同的表示转换为另一种。
          • 是的,但我想知道“通过网络”发送一页数据意味着什么。如果“跨线”是指通过 UART 或 TCP/IP 连接或任何类似的连接,那么无论您如何切断它,您在某种程度上将该页面表示为字节,即使您也有更高的抽象级别,您可以在其中谈论“正在移动”的页面。如果您将某种物理内存从一台机器热交换到另一台机器,那么可以肯定,它永远不会序列化。它非常并行;-)
          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 使用 XML 优于二进制有什么优势
            • 通过网线?你不能。用于存储在文件中?可读性。
            • XML 的优势在于能够解析它的库的可用性。理论上,使用 XML 可以更轻松地跨平台移植序列化格式。甚至还有标准,例如 SOAP。可读性可能是一个加分项,但是... XML 很冗长,因此在实践中通常不那么可读。 XML 的缺点是冗长,而且生成的数据量很大,这会对性能产生影响。
            【解决方案8】:

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

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

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

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

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

            【讨论】:

              【解决方案9】:

              严格来说,它不是 only 选项;您可以提出“远程处理”符合文本中的含义的论点;这里在接收方创建了一个包含 no state 的假对象。所有调用(方法、属性等)都被拦截,只有 callresult 被传输。这避免了传输对象本身的需要,但如果涉及过度“健谈”的使用(即大量调用),可能会变得非常昂贵,因为每个调用都有光速的延迟(加起来)。

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

              【讨论】:

                【解决方案10】:

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

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多