佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > golang的序列化與反序列化的幾種方式

golang的序列化與反序列化的幾種方式

熱門標(biāo)簽:服務(wù)外包 AI電銷 百度競價(jià)排名 Linux服務(wù)器 地方門戶網(wǎng)站 呼叫中心市場需求 鐵路電話系統(tǒng) 網(wǎng)站排名優(yōu)化

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,但是打印出來不好看,這里加上縮進(jìn)
 ret, err := json.MarshalIndent(g, "", " ")
 if err != nil {
 fmt.Println(err)
 } else {
 //得到的是字節(jié)數(shù)組,需要轉(zhuǎn)化成string
 fmt.Println(string(ret))
 /*
 {
  "Name": "satori",
  "Age": 16,
  "Gender": "f",
  "Where": "東方地靈殿",
  "Is_married": false
 }
 */
 }
}

當(dāng)然golang的大小寫我們知道是具有含義的,如果改成小寫, 那么該字段是無法被序列化的。但是這樣序列化之后的字段,也是大寫,如果我們就想要小寫該怎么辦呢?

package main

import (
 "encoding/json"
 "fmt"
)

type Girl struct {
 //使用`json:"xxx"`相當(dāng)于起了一個別名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
 }

 //創(chuàng)建一個變量
 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

標(biāo)準(zhǔn)庫gob是golang提供的“私有”的編解碼方式,它的效率會比json,xml等更高,特別適合在Go語言程序間傳遞數(shù)據(jù)。

序列化

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}

 //創(chuàng)建緩存
 buf := new(bytes.Buffer)
 //把指針丟進(jìn)去
 enc := gob.NewEncoder(buf)

 //調(diào)用Encode進(jìn)行序列化
 if err := enc.Encode(g); err != nil {
 fmt.Println(err)
 return
 } else {
 //序列化的內(nèi)容會被放進(jìn)buf里面
 fmt.Println(buf.String())
 /*
 G��Girl�� Name Age Gender Where 
 Is_married  !��satori f東方地靈殿
 */
 }
}

發(fā)現(xiàn)是亂碼,因?yàn)檫@類似python的pickle,是該語言獨(dú)有的。所以我們不認(rèn)識沒關(guān)系,golang認(rèn)識就行了

反序列化

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數(shù)組,返回一個指針
 dec := gob.NewDecoder(bytes.NewBuffer(buf.Bytes()))
 //調(diào)用Decode方法,傳入結(jié)構(gòu)體對象指針,會自動將buf.Bytes()里面的內(nèi)容轉(zhuǎn)換成結(jié)構(gòu)體
 if err := dec.Decode(g1);err != nil {
 fmt.Println(err)
 return
 } else {
 fmt.Println(g1) // {satori 16 f 東方地靈殿 false}
 }
}

msgpack

MessagePack是一種高效的二進(jìn)制序列化格式。它允許你在多種語言(如JSON)之間交換數(shù)據(jù)。但它更快更小。

安裝

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}
 }
 }
}

到此這篇關(guān)于golang的序列化與反序列化的幾種方式的文章就介紹到這了,更多相關(guān)golang 序列化與反序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • golang中的net/rpc包使用概述(小結(jié))
  • go語言net包rpc遠(yuǎn)程調(diào)用的使用示例
  • Golang Gob編碼(gob包的使用詳解)

標(biāo)簽:黃山 蘭州 湖南 仙桃 崇左 湘潭 銅川 衡水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang的序列化與反序列化的幾種方式》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    新津县| 宁城县| 武冈市| 海原县| 浙江省| 牙克石市| 汉中市| 秭归县| 青冈县| 资源县| 左贡县| 临泽县| 万载县| 新竹市| 崇信县| 巴马| 贵定县| 随州市| 丹东市| 祁连县| 建德市| 岳西县| 河北区| 襄城县| 永胜县| 岑溪市| 肥东县| 微山县| 全椒县| 延寿县| 房山区| 沈丘县| 渑池县| 巴青县| 肇东市| 尖扎县| 凌源市| 济宁市| 布拖县| 德昌县| 美姑县|