天天看点

Go 对象序列化

在程序运行的过程中,所有的变量都是在内存中。可以随时修改变量,但是一旦程序结束,变量所占用的内存就会被操作系统全部回收。如果你想在程序退出后,仍然可以访问数据,就需要使用序列化,将对象的当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

把变量从内存中变成可存储或传输的过程称之为序列化,序列化之后,就可以把序列化后的内容写入到磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化。

序列化的目的

  1. 以某种存储形式使自定义对象持久化
  2. 将对象从一个地方传递到另一个地方
  3. 使程序更具维护性

序列化为json格式

如果要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如

XML

,但通常使用

JSON

格式。因为JSON表示出来就是一个字符串,可以被所有语言读取,且读取速度比XML更快,非常方便。

Go

内置的标准包

encoding/json

下面有

Go

对象到

Json

格式的转化,官方有关介绍可以戳https://golang.org/doc/articles/json_and_go.html。

json.Marshal

func Marshal(v interface{}) ([]byte, error) {
    //...
}
           

Marshal

方法会将Go对象序列化为JSON字符串,而在Go语言底层,一个字符串值即一个包含了若干个字节的序列。字节序列在Go中用

[]byte

类型表示,即一个由8位二进制数表示的无符号整数的切片(

[]uint8

)。

示例

package main

import (
    "fmt"
    "encoding/json"
)

type Info struct {
    Name string
    Age  int
    Sex  string
}

func main() {
    infos := []Info{
        {
			Name: "Sophia",
			Age:  23,
			Sex:  "female",
		},
		{
			Name: "Benjie",
			Age:  24,
			Sex:  "male",
		},
    }
    data, err := json.Marshal(infos)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(data)
    fmt.Println(string(data))

    /*
    [91 123 34 78 97 109 101 34 58 34 83 111 112 104 105 97 34 44 34 65 103 101 34 58 50 51 44 34 83 101 120 34 58 34 102 101 109 9
7 108 101 34 125 44 123 34 78 97 109 101 34 58 34 66 101 110 106 105 101 34 44 34 65 103 101 34 58 50 52 44 34 83 101 120 34 58
 34 109 97 108 101 34 125 93] 
    [{"Name":"Sophia","Age":23,"Sex":"female"},{"Name":"Benjie","Age":24,"Sex":"male"}]
    */
}
           

反序列化json数据为Go对象

json.Unmarshal

func Unmarshal(data []byte, v interface{}) error {
    //...
}
           

Unmarshal

函数会解析JSON编码的数据,然后将结果保存到v中。如果传入的参数v的值为nil,或者类型不是指针,那么函数会返回一个错误。

如果解析的内容字面上为空,那么

Unmarshal

会将结果指向

nil

。否则,会将结果反序列化到v指向的对象中。为了将JSON反序列化到Go结构体,

Unmarshal

会将Json对象中的key和结构体中的key(也可以是结构体标签)进行匹配,而且对大小写不敏感。

示例

package main

import (
	"fmt"
	"encoding/json"
)

type Info struct {
	Name string
	Age  int
	Sex  string
}

func main() {
	var str = []byte(`[
                {"name":"Sophia","age":23,"sex":"female"},
                {"name":"Benjie","age":32,"sex":"male"}
                    ]`)
	var info []Info
	if err := json.Unmarshal(str, &info); err != nil {
		fmt.Println(err.Error())
		return
	}
	fmt.Println(info)
    //打印结果:[{Sophia 23 female} {Benjie 32 male}]
}
           

参考文章

  1. 序列化