浅析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


猜你喜欢
- 目录前言:1.Navicat简介2.简易教程分享连接管理库表操作查询窗口筛选表数据运行与转储 SQL 文件导入与导出向导查看页面设置工具目标
- Python安装流程:一.下载在网上(输入网址https://www.python.org/downloads/)下载Windows最新的p
- 首先我们介绍使用自己的数据库查询多个手机号码,那还是建议你拥有一个自己的的手机号码数据库。正常情况下,只是满足一般查询的话,你不需要去购买专
- 创建变量变量是存放数据值的容器。与其他编程语言不同,Python 没有声明变量的命令。首次为其赋值时,才会创建变量。实例x = 10y =
- 比如代码 binfo = {'name':'jay','age':20,'pytho
- 使用 filters 实现 英文字母 转大写1、template :<di
- 准备工作下载python,本文以python3.6为例。python3.6下载地址:python3下载地址,选择合适的版本安装。安装成功后,
- 本文实例讲述了Python实现备份文件的方法,是一个非常实用的技巧。分享给大家供大家参考。具体方法如下:该实例主要实现读取一个任务文件, 根
- GUI编程之 Pack、Place、Grid的区别本文讲述如何使用 tkinter 的布局管理 (被称作 layout managers 或
- pyenv简单介绍在日常运维中, 经常遇到这样的情况: 系统自带的Python是2.x,而业务部署需要Python 3.x 环境, 此时需要
- 用window.open打开的窗口中,有时候session变量会丢掉,给asp编程带来的一定的麻烦。用参数传递解决它:<DIV&nbs
- 一般情况下,导出超时可能都是以下三种情况:一、sql语句复杂,查询时间过长;二、处理查询后数据逻辑冗余;三、数据量过大导致响应超时。接下来分
- 英文文档:vars([object])Return the __dict__ attribute for a module, class,
- 索引概述介绍索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这
- 在cmd控制台内,vue -V 可看到vue-cli脚手架的版本号,现在好多帖子误写成vue版本号。如下图:vue版本号在项目中,找到pac
- 问题描述字符串本身作为 bytess = '\xe4\xbd\xa0\xe5\xa5\xbd'解决方案s.encode(&#
- 在正文开始之前,先了解vue基于源码构建的两个版本,一个是 runtime only ,另一个是 runtime加compiler 的版本,
- 学习如何使用 Python 的 Pygame 模块编程电脑游戏,并开始操作引力。真实的世界充满了运动和生活。物理学使得真实的生活如此忙碌和动
- 复制是将主数据库的DDL和DML操作通过二进制日志传到从库上,然后再从库重做,从而使得从库和主库保持数据的同步。MySQL可以从一台主库同时
- Python传入参数的方法有:位置参数、默认参数、可变参数、关键字参数、和命名关键字参数、以及各种参数调用的组合写在前面Python唯一支持