go - Golang Proto 中的 Marshal 和 unmarshal 是什么?
问题描述
我知道我们需要编组对象以对其进行序列化,并取消编组以对其进行反序列化。但是我的问题是,我们什么时候调用 marshal 和 unmarshal 以及如果我们很快要再次反序列化它为什么要序列化对象?
PS 我刚开始学习 Go 和 Proto,非常感谢您的帮助。谢谢你。
解决方案
好问题!
编组(也称为序列化)将结构转换为原始字节。通常,当您将数据发送到程序外部的某些东西时,您会这样做:您可能正在写入文件或发送 HTTP 请求正文中的结构。
解组(也称为反序列化)将原始字节转换为结构。当您从程序外部接受数据时,您会这样做:您可能正在从文件或 HTTP 响应正文中读取数据。
在这两种情况下,发送数据的程序都将其作为结构保存在内存中。我们必须编组和解组,因为接收程序不能只进入发送者的内存并读取结构。为什么?
- 通常这两个程序在不同的计算机上,因此它们不能直接访问彼此的内存。
- 即使对于同一台计算机上的两个进程,共享内存也很复杂并且通常很危险。如果当其他程序读取数据时,您正在覆盖数据中途会发生什么?如果您的结构包含敏感数据(如解密的密码)怎么办?
- 即使共享内存,两个程序也需要以相同的方式解释数据。不同的语言,甚至不同版本的 Go,在内存中表示相同的结构不同。例如,你是用最重要的位在前还是最后来表示整数?根据他们的答案,一个程序可能会解释
001
为 integer1
,而另一个程序可能会将相同的内存解释为 integer4
。
如今,我们通常对一些标准化格式进行编组和解组,例如 JSON、CSV 或 YAML。(在过去,这并不总是正确的——您经常使用当时对您有意义的任何逻辑手动将结构转换为字节或从字节转换。)Protobuf 模式使生成封送和解封代码变得更加容易它具有 CPU 和空间效率(与 CSV 或 JSON 相比)、强类型以及跨编程语言的一致性。
推荐阅读
- lint - 如何定义 nx-lint 的异常?
- python - 无法将 json 转换为 csv
- r - R - pca 轴线
- python - Python嵌套字典到熊猫数据框
- list - 进行缓存时无法转换为 java.util.List 错误
- apache - Telegram Bot - 带有letsencrypt证书的Webhook SSL错误
- javascript - Javascript 过滤器功能无法正常工作
- ios - 访问索引 0 NSAttributedString iOS Swift 处的属性时崩溃
- python - Python 比较 Python 3 中的两个列表元素
- javascript - 在 JavaScript 中使用输入值而不是循环的第一条语句