为什么要序列化和反序列化

  我们的数据对象要在网络中传输或保存到文件,就需要对其编码和解码动作,目前存在很多编码格式:json, XML, Gob, Google Protocol Buffer 等, Go 语言当然也支持所有这些编码格式。

序列化与反序列化定义

  序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。通过从存储区中读取对象的状态,重新创建该对象,则为反序列化

序列化和反序列化规则

Go类型              json 类型

bool                   booleans

float64               numbers

string                 strings

nil                      null

在解析 json 格式数据时,若以 interface{} 接收数据,需要按照以上规则进行解析。

代码演示

反序列化

package main

import (
"encoding/json"
"fmt"
) type People struct {
name string `json:"name"` // name,小写不导出
Age int `json:"age"` // age
Gender string `json:"gender"` // gender
Lesson
} type Lesson struct {
Lessons []string `json:"lessons"`
} func main() {
jsonstr := `{"Age": ,"name": "Jim" ,"gender": "男","lessons":["English","History"],"Room":,"n":null,"b":false}` // 反序列化
var people People
if err := json.Unmarshal([]byte(jsonstr),&people); err == nil {
fmt.Println("struct people:")
fmt.Println(people)
} // 反序列化 json 字符串中的一部分
var lessons Lesson
if err := json.Unmarshal([]byte(jsonstr),&lessons); err == nil {
fmt.Println("struct lesson:")
fmt.Println(lessons)
} // 反序列化 json 字符串数组
jsonstr = `["English","History"]`
var str []string
if err := json.Unmarshal([]byte(jsonstr), &str); err == nil {
fmt.Println("struct str:")
fmt.Println(str)
}
} // 打印结果
  struct people:
  { 男 {[English History]}}
  struct lesson:
  {[English History]}
  struct str:
  [English History]

反序列化

序列化

package main

import (
"encoding/json"
"fmt"
) type People struct {
name string `json:"name"` // name,小写不导出
Age int `json:"age"` // age,在 json 字符串中叫 age
Gender string `json:"gender"` // gender
Lesson
} type Lesson struct {
Lessons []string `json:"lessons"`
} func main() {
lesson := Lesson{[]string{"Math","English","Chinese"}}
people := &People{
name: "amy",
Age: ,
Gender: "female",
Lesson: lesson,
}
if b, err := json.Marshal(people); err != nil {
fmt.Println("Marshal failed...")
}else {
fmt.Println(b)
fmt.Println(string(b))
}
} // 打印结果
[ ]
{"age":,"gender":"female","lessons["Math","English","Chinese“}

序列化

序列化-->传输-->反序列化

package main

import (
"fmt"
"encoding/json"
) type Student struct {
Name string
Age int
Guake bool
Classes []string
Price float32
} func (s * Student)ShowStu() {
fmt.Println("show Student :")
fmt.Println("\tName\t:", s.Name)
fmt.Println("\tAge\t:", s.Age)
fmt.Println("\tGuake\t:", s.Guake)
fmt.Println("\tPrice\t:", s.Price)
fmt.Printf("\tClasses\t: ")
for _, a := range s.Classes {
fmt.Printf("%s ", a)
}
fmt.Println("")
} func main() {
st := &Student {
"Xiao Ming",
,
true,
[]string{"Math", "English", "Chinese"},
9.99,
}
fmt.Println("before JSON encoding :")
st.ShowStu() b, err := json.Marshal(st)
if err != nil {
fmt.Println("encoding faild")
} else {
fmt.Println("encoded data : ")
fmt.Println(b)
fmt.Println(string(b))
}
ch := make(chan string, )
go func(c chan string, str string){
c <- str
}(ch, string(b))
strData := <-ch
fmt.Println("--------------------------------")
stb := &Student{}
stb.ShowStu()
err = json.Unmarshal([]byte(strData), &stb)
if err != nil {
fmt.Println("Unmarshal faild")
} else {
fmt.Println("Unmarshal success")
stb.ShowStu()
}
}

示例

json 数据编码和解码

  json 包提供了 Decoder 和 Encoder 类型来支持常用 json 数据流读写。NewDecoder 和 NewEncoder 函数分别封装了 io.Reader 和 io.Writer 接口。

package main

import (
"encoding/json"
"fmt"
"os"
"strings"
) type People struct {
name string `json:"name"` // name,小写不导出
Age int `json:"age"` // age,在 json 字符串中叫 age
Gender string `json:"gender"` // gender
Lesson
} type Lesson struct {
Lessons []string `json:"lessons"`
} func main() { jsonStr := `{"Age": ,"name": "Jim" ,"gender": "男","lessons":["English","History"],"Room":,"n":null,"b":false}`
strR := strings.NewReader(jsonStr)
people := &People{} // 用 NewDecoder && Decode 进行解码给定义好的结构体对象 people
err := json.NewDecoder(strR).Decode(people)
if err != nil {
fmt.Println(err)
}
fmt.Printf("%+v",people) // // 用 NewEncoder && Encode 把保存的 people 结构体对象编码为 json 保存到文件
f, err := os.Create("./people.json")
json.NewEncoder(f).Encode(people) }

示例

Golang---序列化和反序列化的更多相关文章

  1. golang数据传输格式-序列化与反序列化

    golang数据传输格式-序列化与反序列化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机专业毕业的小伙伴应该都知道数据想要持久化存储,必须将其存在I/O设备里面,这些I ...

  2. golang的序列化与反序列化的几种方式

    golang用来序列化的模块有很多,我们来介绍3个. json 首先登场的是json,这个几乎毋庸置疑. 序列化 package main import ( "encoding/json&q ...

  3. go语言之行--文件操作、命令行参数、序列化与反序列化详解

    一.简介 文件操作对于我们来说也是非常常用的,在python中使用open函数来对文件进行操作,而在go语言中我们使用os.File对文件进行操作. 二.终端读写 操作终端句柄常量 os.Stdin: ...

  4. C# Json之序列化与反序列化

    前言:在实际开发过程中经常都要和Json打交道,序列化与反序列化就成了开发中必不可缺的技能.本篇博客就教大家如何进行Json序列化与反序列化. 首先要添加引用NuGet包,Newtonsoft.Jso ...

  5. [Go] 使用protobuf进行序列化和反序列化

    先定义消息类型 orders.proto syntax = "proto2"; package message; message Orders { required int32 o ...

  6. C# 序列化与反序列化几种格式的转换

    这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...

  7. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  8. Java 序列化与反序列化

    1.什么是序列化?为什么要序列化? Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程. 我们都知道,在进行浏览器访问的时候,我们看到的文本.图片.音频. ...

  9. C#中怎样实现序列化和反序列化

    我们想要将数据进行持久化的操作的话,也就是将数据写入到文件中,我们在C#中可以通过IO流来操作,同时也可以通过序列化来操作,本人是比较推荐使用序列化操作的 因为我们如果想要将一个对象持久化到文件中 如 ...

  10. Java序列化与反序列化

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

随机推荐

  1. 第3节 sqoop:2、sqoop的基本简介和安装

    3. sqoop数据迁移 3.1.概述 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具. 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS.HI ...

  2. 微信小程序循环中点击一个元素,其他的元素不发生变化,类似点击一个循环中的语音,其他的不发生点击事件

    类似语音,因为都在一个数据内,所以点击第一个,所有的语音都变化,解决方法就是 把整个数据都获取下来,然后更改其中一个需要更改的值,然后再把整个数据都setdata回去,如果需要动画的话,wxml里面放 ...

  3. imagenet下载及训练

    imagenet 种子 迅雷打开验证集http://academictorrents.com/download/5d6d0df7ed81efd49ca99ea4737e0ae5e3a5f2e5.tor ...

  4. Win7安装Oracle Instantclient ODBC驱动 后配置DSN时出错的解决办法 SQORAS32

    安装过程简述 oracle官网下载了 instantclient-odbc-nt--.zip instantclient-basic-nt-.zip 我这是32位版的win7,按照需要下载对应的版本. ...

  5. 腾讯X5内核使用详解(X5内核播放器使用如何去除控制栏全屏播放)以及一些注意事项

    例子下载地址 https://www.lanzous.com/i2zsv5g      GIT就不用了麻烦的不行 本人安卓刚学 就上X5内核弄了老长时间由于对maven 和idea不熟悉刚开始导包都是 ...

  6. Fréchet Inception Distance(FID)

    计算 IS 时只考虑了生成样本,没有考虑真实数据,即 IS 无法反映真实数据和样本之间的距离,IS 判断数据真实性的依据,源于 Inception V3 的训练集 ------ ImageNet,在 ...

  7. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-eject

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  8. 06 MySQL运算符

    算数运算符     +    -    *    /    DIV    %    MOD   比较运算符     =    <>    !=    <=>(安全等于,NULL ...

  9. 批量处理文件的Python程序

    经常批量处理文件,这里有个python的模板,保存一下 这个例子是把目录里面所有子目录的mp3文件放慢0.85倍并保存到./processed/目录下面. #coding=utf-8 import s ...

  10. 十六、SAP中查看数据库

    一.我们输入事务代码SE11 二.我们输入数据库表 : “SPFLI” 三.我们可以查看到这个表相关的数据,这个是SAP自带的一个教学案例表. 四.我们点击Display,来查看这个表内容 五.点击查 ...