【问题标题】:What is Marshal and unmarshal in Golang Proto?Golang Proto 中的 Marshal 和 unmarshal 是什么?
【发布时间】:2021-09-15 07:36:57
【问题描述】:

我知道我们需要编组对象以对其进行序列化,并取消编组以对其进行反序列化。但是我的问题是,我们什么时候调用 marshal 和 unmarshal,如果我们很快要再次反序列化,为什么还要序列化对象?

PS 我刚开始学习 Go 和 Proto,非常感谢您的帮助。谢谢。

【问题讨论】:

  • "... 很快再次反序列化" - 在另一个进程中,可能在另一台机器上。否则不需要任何 proto,在同一个过程中你可以只传递对象。

标签: go proto


【解决方案1】:

好问题!

编组(也称为序列化)将结构转换为原始字节。通常,当您向程序外部的对象发送数据时会执行此操作:您可能正在写入文件或发送 HTTP 请求正文中的结构。

解组(也称为反序列化)将原始字节转换为结构。当您从程序外部接受数据时,您会这样做:您可能正在从文件或 HTTP 响应正文中读取数据。

在这两种情况下,发送数据的程序都将其作为结构体保存在内存中。我们必须编组和解组,因为接收程序不能只进入发送者的内存并读取结构。为什么?

  • 通常这两个程序在不同的计算机上,所以它们不能直接访问彼此的内存。
  • 即使对于同一台计算机上的两个进程,共享内存也很复杂并且通常很危险。如果当其他程序读取数据时,您正在覆盖数据中途会发生什么?如果您的结构包含敏感数据(如解密的密码)怎么办?
  • 即使共享内存,两个程序也需要以相同的方式解释数据。不同的语言,甚至不同版本的 Go,在内存中表示相同的结构不同。例如,你是用最重要的位在前还是最后来表示整数?根据他们的回答,一个程序可能会将001 解释为整数1,而另一个程序可能会将相同的内存解释为整数4

如今,我们通常在一些标准化格式(如 JSON、CSV 或 YAML)中进行编组和解组。 (在过去,这并不总是正确的——您经常使用当时对您有意义的任何逻辑手动将结构转换为字节或从字节转换。)Protobuf 模式使生成封送和解封代码变得更加容易它具有 CPU 和空间效率(与 CSV 或 JSON 相比)、强类型以及跨编程语言的一致性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 2021-12-29
    • 1970-01-01
    • 2013-06-22
    • 2021-01-04
    相关资源
    最近更新 更多