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. Linux下通过shell进MySQL执行SQL或导入脚本

    这条命令表示通过用户名和密码执行shell然后在shell里面执行一个建表语句: USER="root" PASS="root" mysql -u $USER ...

  2. python面向对象之初步认识

    面向对象 类,用来描述一类事物的相同的特征或者属性.比如说,狗,狗属于一种统称,狗还分有不同的种类,比如,牧羊犬,蝴蝶犬,京巴等等,他们都有相同的特征,一个头,两个耳朵,四条腿,会跑,会吃东西,会汪汪 ...

  3. CentOS设置交换分区swap

    环境查看 查看未设置交换分区之前 free -h 新加一块磁盘用于交换分区/dev/sdc 格式化 mkswap /dev/sdc 设置为交换分区 swapon /dev/sdc 再次查看 设置为重启 ...

  4. iOS-Foundation各种NS

    1.1 NSRange NSRange range = NSMakeRange(2, 4);//location=2,len=4    NSString *str = @"i love oc ...

  5. Ubuntu构建LVS+Keepalived高可用负载均衡集群【生产环境部署】

    1.环境说明: 系统版本:Ubuntu 14.04 LVS1物理IP:14.17.64.2   初始接管VIP:14.17.64.13 LVS2物理IP:14.17.64.3   初始接管VIP:14 ...

  6. OAuth 2.0 授权认证详解

    一.认识 OAuth 2.0 1.1 OAuth 2.0 应用场景 OAuth 2.0 标准目前被广泛应用在第三方登录场景中,以下是虚拟出来的角色,阐述 OAuth2 能帮我们干什么,引用阮一峰这篇理 ...

  7. TF-IDF算法与余弦相似性

    (注:本文转载自阮一峰老师的博文,原文地址:http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html) 今天,我们再来研究另一个相关的 ...

  8. IO-file-04 文件的创建

    1. package com.bwie.io; import java.io.File; import java.io.IOException; public class FileDemo4 { /* ...

  9. (模板)poj1113(graham扫描法求凸包)

    题目链接:https://vjudge.net/problem/POJ-1113 题意:简化下题意即求凸包的周长+2×PI×r. 思路:用graham求凸包,模板是kuangbin的. AC code ...

  10. elasticsearch-5.6.1删除index下的某个type

    由于elasticsearch-5.6.1不支持type直接删除,只能删除数据. 执行命令: curl -H "Content-Type: application/json" -X ...