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

  我们的数据对象要在网络中传输或保存到文件,就需要对其编码和解码动作,目前存在很多编码格式: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. python2学习------基础语法5(常用容器以及相关操作)

    1.list(列表) #生成数据list a=[x for x in range(10)]; #print a; #遍历list for i in a: pass; #print i; #追加元素 a ...

  2. git杂碎汇总

    1. .gitignore文件使用 1.如果不想某类文件(编译后.配置等文件)加入到git版本管理,可以在这个文件中配置规则,进行过滤筛选: 2.配置规则 以斜杠"/"表示目录:e ...

  3. 013-PHP输出表格

    <?php // 数据表格化 print("<TABLE bgcolor='ffccoo' BORDER=\"1\">\n"); // 表格开 ...

  4. spingcloud--hystrix(断路器)

    hystrix由来:服务器宕机或者依赖关系失败. hystrix: Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时.异常等,Hyst ...

  5. 四十五、SAP中Message的管理

    一.事务代码SE91 二.输入相关名字,点击创建 三.输入内容 四.定义成本地对象 五.在消息中添加一条短文本 六.我们代码如下 七.执行

  6. 联系我们地图坐标展示js

    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=6d88 ...

  7. Javascript观察者模式(Object.defineProperty、Reflect和Proxy实现)

    什么是观察者模式? 答:在数据发生改变时,对应的处理函数自动执行.函数自动观察数据对象,一旦对象有变化,函数就会自动执行. 参考<原生JavaScript实现观察者模式>(https:// ...

  8. SCA-CNN: Spatial and Channel-wise Attention in Convolutional Networks for Image Captioning

    题目:SCA-CNN: Spatial and Channel-wise Attention in Convolutional Networks for Image Captioning 作者: Lo ...

  9. junit基础学习之-测试controller层(2)

    准备工作: eclipse本身带有junit4,可以直接build path,加入junit. 连接数据库的配置文件需要修改,之前的文件是采用properties+xml文件的形式,但是在测试的时候因 ...

  10. Day 22:网络编程(3)

    TCP通讯协议特点:  1. tcp是基于IO流进行数据 的传输的,面向连接.  2. tcp进行数据传输的时候是没有大小限制的.  3. tcp是面向连接,通过三次握手的机制保证数据的完整性.可靠协 ...