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. UIScrollView实现自动循环滚动广告

    实现效果如下: 功能说明: 程序运行,图片自动循环播放,采用定时器实现; 当用户用手势触摸滑动时,定时器的自动播放取消,停止触摸时,自动无限播放; 代码如下 : 采用封装视图,外部进行调用即可: 1. ...

  2. js 如何让两个等长的数组产生键值对关系

    问题的准确描述:js 将两个长度一样的一维数组 合成一个一维数组,A为键值,B为key值 js 将两个长度一样的一维数组 合成一个一维数组,A为键值,B为key值 如 var arr1=['a','b ...

  3. Ubuntu16.04下KeepAlived+Nginx 布署

    前言         网上已经有很多相关文章,对各种概念介绍的比较清楚,也有各种详细的步骤,这里主要记录本要在ubuntu16.04下的布署过程,主要记录编译安装keepalived时遇到的坑及解决办 ...

  4. react用redux 做的todolist

    ### 1. 创建项目  create - react - app  项目名(shop) ### 2. 进入项目,下载redux  cnpm install redux  --save  ### 3. ...

  5. 如何使用CLI命令行部署VMware VCSA 6.5

    在本文中,我们讨论如何使用CLI部署VMware vCSA 6.5,vCSA 6.0提供了两种实现类型,向导和脚本化.我们将使用一个名为vcsa-deploy的实用程序进行CLI安装.同样vcsa-d ...

  6. 【VS开发】【miscellaneous】 Windows下配置Git

    [转自]http://blog.csdn.net/exlsunshine/article/details/18939329 1.从git官网下载windows版本的git:http://git-scm ...

  7. 基本 Java Bean

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  8. execl文件读取封装

    前言:做自动化常用的公共方法 注:第一次使用记得先 pip install xlrd 模块import xlrd class ReadExecl(): def __init__(self,filena ...

  9. java日志框架系列(8):logback框架PatternLayout详解

    当你想要将记录以你想要的的格式写到目的地时,那么你就需要了解如何设置自定义的格式了. 1.PatternLayout 转换模式:由文本文字和格式转换符组成. 下面了解一下格式转换符与格式修饰符表示的意 ...

  10. js实现——鼠标移动时跟随着一连的小图片

    首先放置一连的image <body> <div><img src="yezi.png" alt="tu"></div ...