马歇尔/解组,编码/解码和JSON的序列化/反序列化之间的关系和区别?

时间:2016-07-27 16:17:24

标签: json serialization go marshalling json-deserialization

在Go的JSON包中,我看到有marshaldecode和其他功能。

我认为decodemarshal相反,但后者意识到我可能错了。

我认为我的基本问题是:

JSON的marshall / unmarshal,编码/解码和序列化/反序列化之间有什么关系和区别?

感谢。

在此处查看示例Why are json package's Decode and Marshal methods used here?

2 个答案:

答案 0 :(得分:4)

我个人会说所有这些术语都是同义词,但编码/解码却不那么重要。在Go Marshal和Unmarshal恰好是用于描述将字符串形式的json转换为对象的术语,反之亦然。但是在C#中,这些相同的方法被称为序列化和反序列化,据我所知,术语根本不在Go中(至少在任何std lib中都没有)。

编码可以用作形容词来描述存储某些数据的格式,最常见的用途可能是字符编码(UTF-8)。在Go中它也被用作名词来描述可以解组/编组json的对象。 Marshal / Unmarshal总是用作动词,你在json上采取行动。

Go中也使用了编码来引用更大类的包来处理从一种编码到另一种编码的转换。

如果你告诉我你正在编组,编组,反序列化或序列化一些对象或者json,我会明白你的意思。如果你说你是json编码对象我会问一个澄清的问题。如果你说'#34;响应是json编码"我会明白你的意思,虽然我认为你使用这些词语而不仅仅是说#34;答案是json"这很奇怪。希望这或多或少是您正在寻找的信息。

哦,也是为了更清晰

Unmarshal == deserialize == decode

Marshal == serialize == encode

答案 1 :(得分:2)

encoding/json包中,Marshal函数和反Unmarshal函数返回并操作单个固定字节片。它们将单个对象转换为字节,反之亦然。

还有EncoderDecoder类型。它们包含EncodeDecode方法,它们对字节流进行操作,分别采用io.Readerio.Writer。它们还允许使用这些流使用换行符分隔符序列化或反序列化多个对象。

Marshal / Unmarshal函数和编码器/解码器类型的基础机制是相同的,它们都使用相同的内部encodeState.marshaldecodeState.unmarshal代码路径。唯一真正的区别是它们为各种使用模式提供了替代访问。