golang序列化方法有哪些

golang序列化方法有:1、利用Gob包管理gob流,gob是和类型绑定的,如果发现多了或者少了,会依据顺序填充或者截断。2、利用json包,能实现RFC 7159中定义的JSON编码和解码;在序列化的过程中,如果结构体内的成员是小写的,则会出现错误。3、利用Binary包,能实现数字和字节序列之间的简单转换以及varint的编码和解码。4、利用protobuf协议。

golang序列化方法有哪些

本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

在编程过程中,我们总是要遇到这样的问题,就是将我们的数据对象要在网络中传输或保存到文件,这就需要对其编码和解码动作。

目前存在很多编码格式:json, XML, Gob, Google Protocol Buffer 等,在Go 语言中,如何对数据进行这样的编码和解码呢?

序列化和反序列化定义

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。

立即学习“go语言免费学习笔记(深入)”;

反过来,把变量从从存储区中重新读取,重新创建该对象,则为反序列化。

在Go语言中,encoding 包就是专门来处理这类序列化的编码和解码的问题。

序列化和反序列化定义

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。

立即学习“go语言免费学习笔记(深入)”;

反过来,把变量从从存储区中重新读取,重新创建该对象,则为反序列化。

在Go语言中,encoding、序列化和反序列化定义

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。

立即学习“go语言免费学习笔记(深入)”;

反过来,把变量从从存储区中重新读取,重新创建该对象,则为反序列化。

在Go语言中,encoding】

package mainimport ("bytes""encoding/gob""fmt""log")type P struct {X, Y, Z intName    string}type Q struct {X, Y *int32Name string}// This example shows the basic usage of the package: Create an encoder,// transmit some values, receive them with a decoder.func main() {// Initialize the encoder and decoder. Normally enc and dec would be// bound to network connections and the encoder and decoder would// run in different processes.var network bytes.Buffer        // Stand-in for a network connection  //Buffer是具有Read和Write方法的可变大小的字节缓冲区。enc := gob.NewEncoder(&network) // Will write to network.dec := gob.NewDecoder(&network) // Will read from network.// Encode (send) some values.err := enc.Encode(P{3, 4, 5, "Pythagoras"})if err != nil {log.Fatal("encode error:", err)}err = enc.Encode(P{1782, 1841, 1922, "Treehouse"})if err != nil {log.Fatal("encode error:", err)}// Decode (receive) and print the values.var q Qerr = dec.Decode(&q)if err != nil {log.Fatal("decode error 1:", err)}fmt.Printf("%q: {%d, %d}\n", q.Name, *q.X, *q.Y)err = dec.Decode(&q)if err != nil {log.Fatal("decode error 2:", err)}fmt.Printf("%q: {%d, %d}\n", q.Name, *q.X, *q.Y)}

登录后复制

"Pythagoras": {3, 4}"Treehouse": {1782, 1841}

登录后复制

// A Buffer is a variable-sized buffer of bytes with Read and Write methods.(Buffer是具有Read和Write方法的可变大小的字节缓冲区)// The zero value for Buffer is an empty buffer ready to use.type Buffer struct {buf      []byte // contents are the bytes buf[off : len(buf)]off      int    // read at &buf[off], write at &buf[len(buf)]lastRead readOp // last read operation, so that Unread* can work correctly.}

登录后复制

"Pythagoras": {3, 4} ==>{[42 255 129 3 1 1 1 80 1 255 130 0 1 4 1 1 88 1 4 0 1 1 89 1 4 0 1 1 90 1 4 0 1 4 78 97 109 101 1 12 0 0 0 21 255 130 1 6 1 8 1 10 1 10 80 121 116 104 97 103 111 114 97 115 0] 0 0}

登录后复制

enc := gob.NewEncoder(&network) // Will write to network.// Encode (send) some values.if err := enc.Encode(P{3, 4, 5, "Pythagoras"}); err != nil {log.Fatal("encode error:", err)}

登录后复制

func main() {l, err := net.Listen("tcp", "127.0.0.1:8000")  //监听端口if err != nil {log.Fatal("net Listen() error is ", err)}p := P{1, 2, 3,"name"}conn, err := l.Accept()if err != nil {log.Fatal("net Accept() error is ", err)}defer func() { _ = conn.Close() }()//参数是conn 时,即可发出enc := gob.NewEncoder(conn)if err = enc.Encode(p); err != nil {  //发生结构体数据log.Fatal("enc Encode() error is ", err)}}

登录后复制

func main() {conn,err := net.Dial("tcp","127.0.0.1:8000")if err != nil {log.Fatal("net Dial() error is ", err)}defer func() { _ = conn.Close() }()/**type Q struct {X, Y intName string} */var q Qdec := gob.NewDecoder(conn)if err = dec.Decode(&q); err != nil {log.Fatal("enc Encode() error is ", err)}fmt.Println(q)}

登录后复制

{1 2 name}

登录后复制

dec := gob.NewDecoder(&network) // Will read from network.if err = dec.Decode(&q);err != nil {log.Fatal("decode error 2:", err)}

登录后复制

type Message struct {QQ      stringAddress string}type Student struct {Id   uint64 `json:"id"` //可以保证json字段按照规定的字段转义,而不是输出 IdAge  uint64 `json:"age"`Data []Message}func main() {m1 := Message{QQ: "123", Address: "beijing"}m2 := Message{QQ: "456", Address: "beijing"}s1 := Student{3, 19, append([]Message{}, m1, m2)}var buf []bytevar err errorif buf, err = json.Marshal(s1); err != nil {log.Fatal("json marshal error:", err)}fmt.Println(string(buf))var s2 Studentif err = json.Unmarshal(buf, &s2); err != nil {log.Fatal("json unmarshal error:", err)}fmt.Println(s2)}//输出://{"id":3,"age":19,"Data":[{"QQ":"123","Address":"beijing"},{"QQ":"456","Address":"beijing"}]}//{3 19 [{123 beijing} {456 beijing}]}

登录后复制

package mainimport ("encoding/json""fmt""log")type Message struct {qq      stringaddress string}type Student struct {Id   uint64 `json:"id"` //可以保证json字段按照规定的字段转义,而不是输出 IdAge  uint64 `json:"age"`Data []Message}func main() {m1 := Message{"123", "beijing"}m2 := Message{"456", "beijing"}s1 := Student{3, 19, append([]Message{}, m1, m2)}var buf []bytevar err errorif buf, err = json.Marshal(s1); err != nil {log.Fatal("json marshal error:", err)}fmt.Println(string(buf))var s2 Studentif err = json.Unmarshal(buf, &s2); err != nil {log.Fatal("json unmarshal error:", err)}fmt.Println(s2)}

登录后复制

{"id":3,"age":19,"Data":[{},{}]}{3 19 [{ } { }]}

登录后复制

type Message struct {qq      stringaddress string}type Student struct {Id   uint64 `json:"id"` //可以保证json字段按照规定的字段转义,而不是输出 IdAge  uint64 `json:"age"`Data []Message}func main() {m1 := Message{"123", "beijing"}m2 := Message{"456", "beijing"}s1 := Student{3, 19, append([]Message{}, m1, m2)}var buf bytes.Bufferenc := gob.NewEncoder(&buf)if err := enc.Encode(s1); err != nil {log.Fatal("encode error:", err) //报错}fmt.Println(string(buf.Bytes()))}

登录后复制

2020/12/30 16:44:47 encode error:gob: type main.Message has no exported fields

登录后复制

package mainimport ("bytes""encoding/binary""fmt")func main() {buf := new(bytes.Buffer)var pi int64 = 255err := binary.Write(buf, binary.LittleEndian, pi)if err != nil {fmt.Println("binary.Write failed:", err)}fmt.Println( buf.Bytes())}//输出:[255 0 0 0 0 0 0 0]

登录后复制

binary.Write failed: binary.Write: invalid type int

登录后复制

以上就是golang序列化方法有哪些的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3157915.html

(0)
上一篇 2025年3月30日 10:26:11
下一篇 2025年3月30日 10:26:26

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论