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支持下 ... 
随机推荐
- Ubuntu-18.04更改安装源为国内源
			环境查看 修改源文件 /etc/apt/sources.list 备份配置文件后把文件内容替换如下 deb http://mirrors.aliyun.com/ubuntu/ bionic main ... 
- 简单的api实现以及动态函数调用
			实现一个简单的api功能,环境python2.7 请求方法:curl http://ip:8000/?name={api中的方法名}|python -m json.tool 只需编写api的方法即可 ... 
- 【c# 学习笔记】接口
			一.什么是接口 接口 可以理解为对一组方法声明进行的同一命名,但这些方法没有提供任何实现.也就是说,把一组方法声明在一个接口中,然后继承于该接口的类都 需要实现这些方法. 例如,很多类型(比如int ... 
- git 命令使用
			//快速删除node_modules: 1.npm install -g rimraf 2. rimraf node_modules 1.本地新建分支并且连接远端 克隆:git clone 远端地址 ... 
- vue告警信息:{ parser: "babylon" } is deprecated.
			告警信息: 13% building modules 28/40 modules 12 active ...dex=0!\src\App.vue{ parser: "babylon" ... 
- Ie浏览器请求400错误,谷歌火狐等浏览器正常请求.
			做项目的时候,遇到一个小的问题.一个location.href="请求的url"在其它浏览器上是可以正常请求的.但是在ie浏览器上确出现奇怪的http请求400错误,我们先来对于h ... 
- mongdb学习
			1.启动mongdb 服务(注启动之前把data 文件夹清空) 2.开发和jpa一样 只是extendMongoRepository 3.实体类只有id注解,属性全为String 
- Airflow怎么删除系统自带的DAG任务
			点击这个按钮 找到dag文件所在路径,并进入路径将其文件删除即可 
- 获取Android手机日志
			方式一:使用USB连接 1.在手机上启用USB调试2.在终端输入adb devices 3.获取日志 只连接一个设备:1)清除已缓存日志:adb logcat -c2)获取日志并保存到本地:adb l ... 
- 【CodeForces】1172E. Nauuo and ODT
			题解 看了一遍题解(以及代码)但是没写代码-- 后来做梦的时候忽然梦到了这道题--意识到我需要补一下-- 这道题就是,对于每种颜色,把没有染成这种颜色的点标成黑点,然后计算每个联通块的平方 然后每个点 ... 
