golang用來序列化的模塊有很多,我們來介紹3個。
json
首先登場的是json,這個幾乎毋庸置疑。
序列化
package main
import (
"encoding/json"
"fmt"
)
type Girl struct {
Name string
Age int
Gender string
Where string
Is_married bool
}
func main() {
g := Girl{"satori", 16, "f","東方地靈殿", false}
//可以直接使用json.Marshal,但是打印出來不好看,這里加上縮進
ret, err := json.MarshalIndent(g, "", " ")
if err != nil {
fmt.Println(err)
} else {
//得到的是字節數組,需要轉化成string
fmt.Println(string(ret))
/*
{
"Name": "satori",
"Age": 16,
"Gender": "f",
"Where": "東方地靈殿",
"Is_married": false
}
*/
}
}
當然golang的大小寫我們知道是具有含義的,如果改成小寫, 那么該字段是無法被序列化的。但是這樣序列化之后的字段,也是大寫,如果我們就想要小寫該怎么辦呢?
package main
import (
"encoding/json"
"fmt"
)
type Girl struct {
//使用`json:"xxx"`相當于起了一個別名xxx,以后序列化出來的字段就叫這個名字,
Name string `json:"name"`
Age int `json:"age"`
Gender string `json:"gender"`
Where string `json:"where"`
Is_married bool `json:"is_married"`
}
func main() {
g := Girl{"satori", 16, "f","東方地靈殿", false}
ret, err := json.MarshalIndent(g, "", " ")
if err != nil {
fmt.Println(err)
} else {
fmt.Println(string(ret))
/*
{
"name": "satori",
"age": 16,
"gender": "f",
"where": "東方地靈殿",
"is_married": false
}
*/
}
}
反序列化
package main
import (
"encoding/json"
"fmt"
)
type Girl struct {
Name string `json:"name"`
Age int `json:"age"`
Gender string `json:"gender"`
Where string `json:"where"`
Is_married bool `json:"is_married"`
}
func main() {
g := Girl{"satori", 16, "f","東方地靈殿", false}
ret, err := json.MarshalIndent(g, "", " ")
if err != nil {
fmt.Println(err)
return
}
//創建一個變量
g2 := Girl{}
//傳入json字符串,和指針
err = json.Unmarshal(ret, g2)
if err != nil {
fmt.Println(err)
}
fmt.Println(g2) //{satori 16 f 東方地靈殿 false}
fmt.Println(g2.Name, g2.Age) // satori 16
}
gob
標準庫gob是golang提供的“私有”的編解碼方式,它的效率會比json,xml等更高,特別適合在Go語言程序間傳遞數據。
序列化
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
type Girl struct {
Name string
Age int `json:"age"`
Gender string `json:"gender"`
Where string `json:"where"`
Is_married bool `json:"is_married"`
}
func main() {
g := Girl{"satori", 16, "f", "東方地靈殿", false}
//創建緩存
buf := new(bytes.Buffer)
//把指針丟進去
enc := gob.NewEncoder(buf)
//調用Encode進行序列化
if err := enc.Encode(g); err != nil {
fmt.Println(err)
return
} else {
//序列化的內容會被放進buf里面
fmt.Println(buf.String())
/*
G��Girl�� Name Age Gender Where
Is_married !��satori f東方地靈殿
*/
}
}
發現是亂碼,因為這類似python的pickle,是該語言獨有的。所以我們不認識沒關系,golang認識就行了
反序列化
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
type Girl struct {
Name string
Age int `json:"age"`
Gender string `json:"gender"`
Where string `json:"where"`
Is_married bool `json:"is_married"`
}
func main() {
g := Girl{"satori", 16, "f", "東方地靈殿", false}
buf := new(bytes.Buffer)
enc := gob.NewEncoder(buf)
if err := enc.Encode(g);err != nil {
fmt.Println(err)
return
}
var g1 = Girl{}
//bytes.NewBuffer和bytes.Buffer類似,只不過可以傳入一個初始的byte數組,返回一個指針
dec := gob.NewDecoder(bytes.NewBuffer(buf.Bytes()))
//調用Decode方法,傳入結構體對象指針,會自動將buf.Bytes()里面的內容轉換成結構體
if err := dec.Decode(g1);err != nil {
fmt.Println(err)
return
} else {
fmt.Println(g1) // {satori 16 f 東方地靈殿 false}
}
}
msgpack
MessagePack是一種高效的二進制序列化格式。它允許你在多種語言(如JSON)之間交換數據。但它更快更小。
安裝
go get -u github.com/vmihailenco/msgpack
序列化和反序列化
接口和json是一致的
package main
import (
"fmt"
"github.com/vmihailenco/msgpack"
)
type Girl struct {
Name string
Age int `json:"age"`
Gender string `json:"gender"`
Where string `json:"where"`
Is_married bool `json:"is_married"`
}
func main() {
g := Girl{"satori", 16, "f", "東方地靈殿", false}
//這個沒有MarshalIndent
if ret, err := msgpack.Marshal(g); err != nil {
fmt.Println(err)
return
} else {
fmt.Println(string(ret)) //��Name�satori�Age� �Gender�f�Where�東方地靈殿�Is_married�
var g1 = Girl{}
if err := msgpack.Unmarshal(ret, g1);err!=nil {
fmt.Println(err)
return
} else {
fmt.Println(g1) // {satori 16 f 東方地靈殿 false}
}
}
}
到此這篇關于golang的序列化與反序列化的幾種方式的文章就介紹到這了,更多相關golang 序列化與反序列化內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- golang中的net/rpc包使用概述(小結)
- go語言net包rpc遠程調用的使用示例
- Golang Gob編碼(gob包的使用詳解)