序列化与反序列化

序列化和反序列化是许多应用程序中常见的两个概念。本节将讨论这两个概念在 Protobuf 中的应用。因此,即使你对这两个概念已经很有信心,理解它们的本质仍然非常重要。一旦你弄清楚了这些概念,接下来的 “编码细节” 部分将变得更加容易理解,在那里我们将深入探讨 Protobuf 如何在幕后进行数据的序列化和反序列化。

让我们先从序列化开始,然后简要介绍反序列化,它是一个相反的过程。序列化的目标是将数据存储为一种更加紧凑或易于阅读的表示形式,以便以后使用。对于 Protobuf,序列化发生在你生成代码中的对象所设置的数据上。例如,如果我们在 Account 结构体中设置了 IdUsernameRight 字段,那么这些数据就是 Protobuf 将要处理的数据。它会将每个字段转换为二进制表示,使用不同的算法来处理不同类型的字段。之后,我们可以使用这个内存中的二进制数据将数据通过网络(比如通过 gRPC)发送,或者将其存储在更持久的存储中。

一旦我们需要再次使用这些序列化的数据,Protobuf 会执行反序列化。反序列化是读取之前创建的二进制数据,并将其填充回你最喜欢的编程语言中的对象的过程。再次强调,Protobuf 会根据数据的类型使用不同的算法来读取底层的二进制数据,并知道如何设置或不设置目标对象中的每个字段。

总而言之,Protobuf 通过二进制序列化使数据比其他格式(如 XMLJSON)更加紧凑。为此,它会从生成代码的对象中的不同字段读取数据,将其转化为二进制数据,然后,当我们最终需要这些数据时,Protobuf 会读取这些数据并填充到给定对象的字段中。