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的序列化与反序列化的几种方式的更多相关文章

  1. 序列化和反序列化的几种方式(DataContractSerializer)(二)

    DataContractSerializer 类 使用提供的数据协定,将类型实例序列化和反序列化为 XML 流或文档. 无法继承此类. 命名空间: System.Runtime.Serializati ...

  2. 序列化和反序列化的几种方式(DataContractSerializer)

    序列化和反序列化的几种方式(DataContractSerializer) DataContractSerializer 类 使用提供的数据协定,将类型实例序列化和反序列化为 XML 流或文档. 无法 ...

  3. 在C#中,Json的序列化和反序列化的几种方式总结

    在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象. 什么是JSON? JSON (JavaScript Object Notation) ...

  4. 序列化和反序列化的几种方式(JavaScriptSerializer 、XmlSerializer、DataContractSerializer)(一)

    JavaScriptSerializer 类 为启用 AJAX 的应用程序提供序列化和反序列化功能. 命名空间:   System.Web.Script.Serialization 程序集:  Sys ...

  5. 在C#中,Json的序列化和反序列化的几种方式总结 转载

    转载自  https://www.cnblogs.com/caofangsheng/p/5687994.html    谢谢 在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据 ...

  6. C#中,Json的序列化和反序列化的几种方式总结

    在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象. 什么是JSON? JSON (JavaScript Object Notation) ...

  7. 在C#中,Json的序列化和反序列化的几种方式

    摘自:http://www.cnblogs.com/caofangsheng/p/5687994.html 在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化 ...

  8. .NET中JSON的序列化和反序列化的几种方式

    一.什么是JSON JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集 ...

  9. Json 序列化以及反序列化的三种方式(二)

    1.什么是JSON? Json[javascript对象表示方法],它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成,它是完全独立于语言的 2.Json支持下 ...

随机推荐

  1. LSTM改善RNN梯度弥散和梯度爆炸问题

    我们给定一个三个时间的RNN单元,如下: 我们假设最左端的输入  为给定值, 且神经元中没有激活函数(便于分析), 则前向过程如下: 在  时刻, 损失函数为  ,那么如果我们要训练RNN时, 实际上 ...

  2. golang web框架 beego 学习 (七)json转数组

    Modules type User struct { Id int64 `json:"id"` Name string `json:"name"` Email ...

  3. 使用使用nltk 和 spacy进行命名实体提取/识别

    1. 什么是 命名实体提取? 参考:https://towardsdatascience.com/named-entity-recognition-with-nltk-and-spacy-8c4a7d ...

  4. superset的安装(win10)踩踩坑!AWSL

    基本安装参考https://www.jianshu.com/p/8b27ff71429f 按此方案装的时候会遇到各种flask版本不兼容的问题,所以 第一步:装好anaconda 第二部:保证好高于V ...

  5. 关闭iTunes自动同步

    方法步骤: 仅对iTunes安装在默认路径的生效. 在「运行」里边先后输入以下两条命令: "C:\Program Files\Common Files\Apple\Apple Applica ...

  6. 使用google的guova开发高并发下的接口限流

    使用google的guova开发高并发下的接口限流 使用google的guova进行限流 1.guova的限流方式,在定时产生定量的令牌,令牌的数量限制了流量 2.增加一个订单接口限流类OrderRa ...

  7. Python基础 第6章 抽象

    1. 引言及抽象和结构 生成斐波那契数列的代码如下: fibs = [0, 1] num = int(input('How many num you want:')) for x in range(n ...

  8. 删除列表的三个方式(python)

    del是个语句而不是方法 del member[1]:通过下标进行删除 del member:也可删除整个列表 remove():根据列表元素本身来删除,而不是通过下标 member.remove(' ...

  9. Django自定义分页并保存搜索条件

    Django自定义分页并保存搜索条件 1.自定义分页组件pagination.py import copy class Pagination: def __init__(self, current_p ...

  10. WUSTOJ 1283: Hamster(Java)

    1283: Hamster 参考博客 wust_tanyao的博客 题目   第0个月有1对仓鼠.仓鼠的寿命是M个月,仓鼠成年后每个月生一对仓鼠(一雌一雄),问N个月后有仓鼠多少对.更多内容点此链接 ...