golang中的序列化和反序列化

简介: golang中的序列化和反序列化

公众号merlinsea


  • 序列化和反序列化的介绍
  • 序列化后得到的结果是一个json字符串
  • 在go中序列化和反序列化结构体的时候,要求结构体的字段首字母大写+ 打上标签
  • 序列化的类型和反序列化得到的类型必须要一样的才可以进行相互转换
  • 可以将任意的类型序列化成json,比如slice序列化后盾结果是一个json数组,数组序列化后得到的是一个json数组,map序列化的结果是json的key-value形式,结构体序列化后的结果是json的key-value形式,通常序列化和反序列化的时候是将有key-value特征的类型进行序列化。
  • 序列化结构体


package main
import "fmt"
import "encoding/json"
// 后面的`json:"name"`在进行序列化和反序列化的时候会使用这个ley
type Monster struct {
   Name  string `json:"name"` // `json:"name"` 就是 struct tag
   Age   int    `json:"age"`
   Skill string `json:"skill"`
}
func main() {
   //1. 创建一个Monster变量
   monster := Monster{"牛魔王", 500, "芭蕉扇~"}
   //2. 将monster变量序列化为 json格式字串
   //   json.Marshal 函数中使用反射
   jsonStr, err := json.Marshal(monster)
   if err != nil {
      fmt.Println("json 处理错误 ", err)
   }
   //jsonStr {"name":"牛魔王","age":500,"skill":"芭蕉扇~"}
   fmt.Println("jsonStr", string(jsonStr))
   monsterTmp := Monster{}
   // Unmarshal第一个类型是[]byte切片,第二个类型是地址
   err = json.Unmarshal(jsonStr, &monsterTmp)
   if err != nil {
      fmt.Println("凡序列化失败")
   } else {
      //类型是 main.Monster,值是{牛魔王 500 芭蕉扇~} 
      fmt.Printf("类型是 %T,值是%v \n", monsterTmp, monsterTmp)
   }
}


  • 序列化slice,slice中包含了多个map
import (
   "encoding/json"
   "fmt"
)
//将切片进行序列化
func marshalSlice() string {
   var slice []map[string]interface{} = make([]map[string]interface{}, 0)
   var m1 map[string]interface{}
   //使用map前,需要先make
   m1 = make(map[string]interface{})
   m1["name"] = "jack"
   m1["age"] = "7"
   m1["address"] = "北京"
   slice = append(slice, m1)
   var m2 map[string]interface{}
   //使用map前,需要先make
   m2 = make(map[string]interface{})
   m2["name"] = "tom"
   m2["age"] = "20"
   m2["address"] = [2]string{"墨西哥", "夏威夷"}
   slice = append(slice, m2)
   //将切片进行序列化操作
   data, err := json.Marshal(slice)
   if err != nil {
      fmt.Printf("序列化错误 err=%v\n", err)
   }
   //输出序列化后的结果
   return string(data)
}
//将序列化后的json凡序列化为切片
func unmarshalSlice(jsonStr string) []map[string]interface{} {
   //定义一个slice
   var slice []map[string]interface{}
   //反序列化,不需要make,因为make操作被封装到 Unmarshal函数
   // 传递地址
   err := json.Unmarshal([]byte(jsonStr), &slice)
   if err != nil {
      fmt.Printf("unmarshal err=%v\n", err)
   }
   return slice
}
func main() {
   var json = marshalSlice()
   //json =  [{"address":"北京","age":"7","name":"jack"},{"address":["墨西哥","夏威夷"],"age":"20","name":"tom"}]
   fmt.Println("json = ", json)
   var slice = unmarshalSlice(json)
   // [map[address:北京 age:7 name:jack] map[address:[墨西哥 夏威夷] age:20 name:tom]]
   fmt.Println(slice)
}


相关文章
|
2月前
|
NoSQL 测试技术 Go
【Golang】国密SM2公钥私钥序列化到redis中并加密解密实战_sm2反编(1)
【Golang】国密SM2公钥私钥序列化到redis中并加密解密实战_sm2反编(1)
|
2月前
|
存储 安全 Java
Java一分钟之-Java序列化与反序列化
【5月更文挑战第14天】Java序列化用于将对象转换为字节流,便于存储和网络传输。实现`Serializable`接口使类可被序列化,但可能引发隐私泄露、版本兼容性和性能问题。要避免这些问题,可使用`transient`关键字、控制`serialVersionUID`及考虑使用安全的序列化库。示例代码展示了如何序列化和反序列化对象,强调了循环引用和未实现`Serializable`的错误。理解并妥善处理这些要点对优化代码至关重要。
34 1
|
17天前
|
存储 Java
JaveSE—IO流详解:对象输入输出流(序列化及反序列化)
JaveSE—IO流详解:对象输入输出流(序列化及反序列化)
|
21天前
|
JSON Java API
jackson序列化和反序列化中的注解和扩展点大全【收藏】
jackson序列化和反序列化中的注解和扩展点大全【收藏】
|
22天前
|
存储 JSON 数据库
Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术
Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术
|
1月前
|
网络协议 Java API
【Java】序列化和反序列化
【Java】序列化和反序列化
21 4
|
1月前
|
Java 数据安全/隐私保护 Android开发
Java基础21-读懂Java序列化和反序列化(二)
Java基础21-读懂Java序列化和反序列化(二)
98 1
|
1月前
|
XML 存储 Java
Java基础21-读懂Java序列化和反序列化(一)
Java基础21-读懂Java序列化和反序列化(一)
21 1
|
1月前
|
JSON 缓存 Java
【Java基础】 序列化和反序列化
Java中的序列化(Serialization)和反序列化(Deserialization)是将对象和字节流之间进 行相互转换的过程。这两个过程用于保存对象的状态并能够在需要时恢复这些状态。
16 1
|
20天前
|
存储 Java 数据库
Java中序列化与反序列化详解
Java中序列化与反序列化详解
14 0