浅析Go中序列化与反序列化的基本使用
作者:陪我去看海 发布时间:2024-02-13 00:40:46
什么是序列化与反序列化
这里引入微软对序列化的解释:
序列化是指将对象转换成字节流,从而存储对象或将对象传输到内存、数据库或文件的过程。 它的主要用途是保存对象的状态,以便能够在需要时重新创建对象。 反向过程称为“反序列化”。
序列化工作原理
将对象序列化为带有数据的流。可以将此流中的对象存储在数据库,文件或者内存中。
在Go中如何序列化一个对象
首先 go
给我提供了便捷的 xml序列化的 API,直接使用即可,我们来看看效果
package main
import (
"encoding/xml"
"fmt"
)
type person struct {
Name string
Age int
}
func main() {
p1 := person{"pkc", 22}
// xml 序列化
if data, err := xml.Marshal(p1); err != nil{
fmt.Println(err)
return
} else {
fmt.Println(data)
// 将 byte 转为 string
fmt.Println(string(data))
}
}
这里我们初始化了一个 struct 对象
,将 struct
实例化为 p1
,然后使用了 Go
给我们提供的序列化API xml.Marshal
,该API是返回两个值 ([]byte, error)
,将结果进行字符串类型转换后,可以得到结果,是不是看起来很熟悉的感觉呢,就像是标签和标签包裹的内容。
最后的结果:
[60 112 101 114 115 111 110 62 60 78 97 109 101 62 112 107 99 60 47 78 97 109 101 62 60 65 103 101 62 50 50 60 47 65 103 101 62 60 47 112 101 114 115 111 110 62]
<person><Name>pkc</Name><Age>22</Age></person>
这时候看他,一行显示完,好像不具备可读性。
如何格式化序列化后的数据
这时候 Go
也给我们提供了另一个API,MarshalIndent
,该API接收三个参数,分别是,(要序列化的对象,每行的前缀,缩进字符)
// 将
xml.Marshal(p1)
// 修改为
xml.MarshalIndent(p1, "", " ")
得到结果:
[60 112 101 114 115 111 110 62 10 9 60 78 97 109 101 62 112 107 99 60 47 78 97 109 101 62 10 9 60 65 103 101 62 50 50 60 47 65 103 101 62 10 60 47 112 101 114 115 111 110 62]
<person>
<Name>pkc</Name>
<Age>22</Age>
</person>
这时候我们得到了一个 xml
结构,但是标签一般都会加上属性,这时候想,如何给标签能加上属性呢
如何给序列化后的xml加上属性
假设:我们要给 Person 标签添加属性 class,我们应该如何做
将代码修改后:
package main
import (
"encoding/xml"
"fmt"
)
// `xml:"xxx,attr"`,xxx 是自定义属性,如果不填,那属性名就是键名:Class
type person struct {
Class string `xml:"class,attr"`
Name string
Age int
}
func main() {
p1 := person{"container", "pkc", 22}
// xml 序列化
if data, err := xml.MarshalIndent(p1, "", " "); err != nil{
fmt.Println(err)
return
} else {
fmt.Println(data)
// 将 byte 转为 string
fmt.Println(string(data))
}
}
这里使用了Go中struct中的field tag语法
是声明类型之后的注解,这样就成功给标签添加上属性以及值了
结果:
[60 112 101 114 115 111 110 32 99 108 97 115 115 61 34 99 111 110 116 97 105 110 101 114 34 62 10 9 60 78 97 109 101 62 112 107 99 60 47 78 97 109 101 62 10 9 60 65 103 101 62 50 50 60 47 65 103 101 62 10 60 47 112 101 114 115 111 110 62]
<person class="container">
<Name>pkc</Name>
<Age>22</Age>
</person>
如何将xml反序列化为一个对象
说完了序列化,那么我们拿着序列化之后的数据,如何反序列化变成我们想要的结构呢
这里Go
也是提供了API,Unmarshal
,该API接收两个参数,第一个([]byte,接收反序列化后的对象),代码修改后
package main
import (
"encoding/xml"
"fmt"
)
type person struct {
Class string `xml:"class,attr"`
Name string
Age int
}
func main() {
var data []byte
var err error
p1 := person{"container", "pkc", 22}
// xml 序列化
if data, err = xml.MarshalIndent(p1, "", " "); err != nil{
fmt.Println(err)
return
}
fmt.Println(data)
// 将 byte 转为 string
fmt.Println(string(data))
fmt.Println()
// 创建示例接收反序列化的对象
p2 := new(person)
if err = xml.Unmarshal(data, p2); err != nil {
fmt.Println(err)
return
}
fmt.Printf("反序列化后:%v", p2)
}
结果:
[60 112 101 114 115 111 110 32 99 108 97 115 115 61 34 99 111 110 116 97 105 110 101 114 34 62 10 9 60 78 97 109 101 62 112 107 99 60 47 78 97 109 101 62 10 9 60 65 103 101 62 50 50 60 47 65 103 101 62 10 60 47 112 101 114 115 111 110 62]
<person class="container">
<Name>pkc</Name>
<Age>22</Age>
</person>
反序列化后:&{container pkc 22}
来源:https://juejin.cn/post/7198350384338763835
猜你喜欢
- Server对象提供对服务器上访问的方法和属性.大多数方法和属性是作为实用程序的功能提供的。语法:Server.property|metho
- 一,PHP脚本与动态页面。 PHP脚本是一种服务器端脚本程序,可通过嵌入等方 法与HTML文件混合,也可以类,函数封
- Keyboard Scan Codes (Numerical Order)Keyboard Scan Codes (Numeri
- var fso = new ActiveXObject("Scripting.
- 1、吃金币源码分享:import osimport cfgimport sysimport pygameimport randomfrom
- rss的优点 1.您可以有选择地浏览您感兴趣的以及与您的工作相关的新闻。 2.您可以把需要的信息从不需要的信息(兜售信息,垃圾邮件等)中分离
- min()方法返回它的参数最小值:最接近负无穷大的值。语法以下是min()方法的语法:min( x, y, z, .... )参
- 在pyqt5编程过程中,经常会遇到输入或选择多个参数的问题,把多个参数写到一个窗口中,主窗口会显得很臃肿,所以,一般是添加一个按钮,调用对话
- 启动IDLE后会打开Python shell窗口。当键入代码 时,它会基于Python语法提供自动缩进和代码着色功能。使用IDLE中的Pyt
- 静态页面由于其稳定性快速性,的确给SE、用户及站长带来了方便。但有时,需要记住用户的信息,如用户留下评论后,下一次再来,就要记住该用户的信息
- 1. 介绍上传的图片文件:如pic = request.FILES["picture"]# pic是 <class
- 爬虫所需要的功能,基本上在urllib中都能找到,学习这个标准库,可以更加深入的理解后面更加便利的requests库。首先在Pytho2.x
- 小编在以前给大家介绍过很多其他系统安装PyCharm的过程,有兴趣的朋友可以参阅:pycharm 使用心得(一)安装和首次使用python安
- 前言:Python smtplib 教程:展示了如何使用 smtplib 模块在 Python 中发送电子邮件。 要发送电子邮件,我们使用
- 本文实例为大家分享了python实现贪吃蛇双人大战的具体代码,供大家参考,具体内容如下晚上家里小朋友要玩贪吃蛇游戏,还要跟我对战,一时半会我
- 1、python安装可以跨平台2、有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容windows安装:第一种方法官网安装:在官
- 本文主要研究的是tornado 多进程模式的相关内容,具体如下。官方文档的helloworld实例中的启动方法:if __name__ ==
- 目录使用 sync.WaitGroup空 select死循环用 sync.Mutexos.Signal空 channel 或者 nil ch
- 进入:直接输入python即可,如图所示退出:1:输入exit(),回车2:输入quit(),回车3:输入ctrl+z,回车来源:https
- 前言有时,我们希望判断文本框中用户输入的字符是否含有特殊符号(*/#$@),就像用户注册时密码框的填写。demo利用 RegExp 对象,能