golang的序列化与反序列化的几种方式
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的序列化与反序列化的几种方式的更多相关文章
- 序列化和反序列化的几种方式(DataContractSerializer)(二)
DataContractSerializer 类 使用提供的数据协定,将类型实例序列化和反序列化为 XML 流或文档. 无法继承此类. 命名空间: System.Runtime.Serializati ...
- 序列化和反序列化的几种方式(DataContractSerializer)
序列化和反序列化的几种方式(DataContractSerializer) DataContractSerializer 类 使用提供的数据协定,将类型实例序列化和反序列化为 XML 流或文档. 无法 ...
- 在C#中,Json的序列化和反序列化的几种方式总结
在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象. 什么是JSON? JSON (JavaScript Object Notation) ...
- 序列化和反序列化的几种方式(JavaScriptSerializer 、XmlSerializer、DataContractSerializer)(一)
JavaScriptSerializer 类 为启用 AJAX 的应用程序提供序列化和反序列化功能. 命名空间: System.Web.Script.Serialization 程序集: Sys ...
- 在C#中,Json的序列化和反序列化的几种方式总结 转载
转载自 https://www.cnblogs.com/caofangsheng/p/5687994.html 谢谢 在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据 ...
- C#中,Json的序列化和反序列化的几种方式总结
在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象. 什么是JSON? JSON (JavaScript Object Notation) ...
- 在C#中,Json的序列化和反序列化的几种方式
摘自:http://www.cnblogs.com/caofangsheng/p/5687994.html 在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化 ...
- .NET中JSON的序列化和反序列化的几种方式
一.什么是JSON JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集 ...
- Json 序列化以及反序列化的三种方式(二)
1.什么是JSON? Json[javascript对象表示方法],它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成,它是完全独立于语言的 2.Json支持下 ...
随机推荐
- python迭代器、生成器、装饰器之迭代器
迭代是Python最强大的功能之一,是访问集合元素的一种方式. 一般分为可迭代对象,迭代器,可迭代对象不一定是迭代器,但迭代器一定是可迭代对象 1.可以直接作用于for循环的数据类型 第一类:集合数据 ...
- VMware VSAN 设计规则
1.集群节点数量:3-64台主机(生产环境最少4节点起,5.5版本支持32节点,6.0版本支持64节点),配置万兆网卡,主机规格应满足VSAN兼容性要求. 2.每台主机需配置磁盘组,每台主机的磁盘组数 ...
- Spring 控制器层如何启用验证?
1.示例代码 @PostMapping("/adduser") public String addUser(@Valid User user,BindingResult bindi ...
- easyui 解决连弹两个dialog时候,第二个dialog居中问题
$('#showDivSecond').dialog('center'); (该方法自1.3.1版开始可用)
- SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题
原文链接:https://segmentfault.com/a/1190000012879279 当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异.笔者前几天刚好在负责一个项目的权限管理 ...
- 简单谈一谈Java内部类的使用原因
使用内部类的原因 学习总得知其所以然,前面的一篇文章中我有提到过关于java内部类的几种用法以及一些示例,但是不明白内部类具体可以做什么,显然学习起来很渺茫,今天的文章简单说一说使用内部类的几个原因, ...
- nohup启动后台进程并重定向
一:linux重定向 0,1,2分别表示标准输入,标准输出和标准错误输出,一般情况下默认是标准输出 a. 1>log:标准输出重定向的log文件 b. 2>log:错误输出重定向到log文 ...
- centos 7.2安装git2.x版本
前言 今天在我的centos7.2开发环境安装git2.x时候遇到了各种问题,还好一一解决,为方便大家,这里列出遇到的问题和解决办法,yum默认安装的git1.8版本的,公司git服务器在window ...
- PHP基础之函数
函数概念: 函数是用来完成某种特定任务的可重用代码块; 函数可以使程序更具模块化,拥有良好的结构; 函数定义后在程序中可以重复调用; 函数分为内置函数和自定义函数 考点: 变量的作用域和静态变量 延伸 ...
- C++中如何记录程序运行时间
一.clock()计时函数clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t.在MSDN中,查得对clock函数定义如下:clock_t clock(void) ;简单而言, ...