Golang---序列化和反序列化
为什么要序列化和反序列化
我们的数据对象要在网络中传输或保存到文件,就需要对其编码和解码动作,目前存在很多编码格式: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---序列化和反序列化的更多相关文章
- golang数据传输格式-序列化与反序列化
golang数据传输格式-序列化与反序列化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机专业毕业的小伙伴应该都知道数据想要持久化存储,必须将其存在I/O设备里面,这些I ...
- golang的序列化与反序列化的几种方式
golang用来序列化的模块有很多,我们来介绍3个. json 首先登场的是json,这个几乎毋庸置疑. 序列化 package main import ( "encoding/json&q ...
- go语言之行--文件操作、命令行参数、序列化与反序列化详解
一.简介 文件操作对于我们来说也是非常常用的,在python中使用open函数来对文件进行操作,而在go语言中我们使用os.File对文件进行操作. 二.终端读写 操作终端句柄常量 os.Stdin: ...
- C# Json之序列化与反序列化
前言:在实际开发过程中经常都要和Json打交道,序列化与反序列化就成了开发中必不可缺的技能.本篇博客就教大家如何进行Json序列化与反序列化. 首先要添加引用NuGet包,Newtonsoft.Jso ...
- [Go] 使用protobuf进行序列化和反序列化
先定义消息类型 orders.proto syntax = "proto2"; package message; message Orders { required int32 o ...
- C# 序列化与反序列化几种格式的转换
这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- Java 序列化与反序列化
1.什么是序列化?为什么要序列化? Java 序列化就是指将对象转换为字节序列的过程,而反序列化则是只将字节序列转换成目标对象的过程. 我们都知道,在进行浏览器访问的时候,我们看到的文本.图片.音频. ...
- C#中怎样实现序列化和反序列化
我们想要将数据进行持久化的操作的话,也就是将数据写入到文件中,我们在C#中可以通过IO流来操作,同时也可以通过序列化来操作,本人是比较推荐使用序列化操作的 因为我们如果想要将一个对象持久化到文件中 如 ...
- Java序列化与反序列化
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
随机推荐
- Oracle删除重复数据并且只留其中一条数据
数据库操作中,经常会因为导数据造成数据重复,需要进行数据清理,去掉冗余的数据,只保留正确的数据 一:重复数据根据单个字段进行判断 1.首先,查询表中多余的数据,由关键字段(name)来查询. sele ...
- 【LeetCode】字符串中的第一个唯一字符
[问题]给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. s = "leetcode" 返回 . s = "loveleetcode ...
- centos安装sass环境必看
首先了解一下 sass是什么?! sass号称“世界上最成熟.最稳定.最强大的专业级css扩展语言” ,sass基于于Ruby语言开发而成,因此安装sass前需要安装Ruby, 1.安装ruby y ...
- Python 必知的 20 个骚操作!
以下为译文: Python 是一个解释型语言,可读性与易用性让它越来越热门. 正如 Python 之禅中所述: 优美胜于丑陋,明了胜于晦涩. 在你的日常编码中,以下技巧可以给你带来意想不到的收获. ...
- 013、MySQL取本月最后日期,取每个月的最后一天日期
#取本月最后一天 SELECT last_day( curdate( ) ); #取上个月最后一天 , INTERVAL MONTH ) ); , INTERVAL MONTH ) ); , INTE ...
- leetcode303 Range Sum Query - Immutable
""" Given an integer array nums, find the sum of the elements between indices i and j ...
- I0.0 上升边沿 清空 MW10~MW58 联系多个知识点融合
编写程序 在I1.2 的上升边沿 触发 MW8+1的程序 实现方式1 M1.1 为中间变量 对应的STL语句表 执行结果 OK 已经仿真 . 现在尝试第2种方法 实现方式2: M1.1也是中间变量 S ...
- 图片字节流生成bmp文件
1 BITMAPFILEHEADER bfh;//文件头 2 bfh.bfType=0x4d42; bfh.bfOffBits=sizeof(bfh)+sizeof(BITMAPINFOHEADER) ...
- python 定义一个空集合、空字典
s = set() #定义一个空集合 s = {} #定义一个空字典
- Win10下用selenium、Image.crop() 截图时、坐标不准确的问题
截百度按钮的图 先将整个窗口的图保存下来 from selenium import webdriver driver = webdriver.Chrome() driver.get('https:// ...