小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

序列化与反序列化

Code Tools,java,golang 额外说明

收录于:18天前

JSON
JSON是一种轻量级的数据交换格式,易于编写也易于机器解析和生成。

JSON格式可以有效提高网络传输效率。在传输过程中,可以将程序中的数据类型序列化为json字符串,在接收端通过反序列化恢复原来的数据格式。

序列化
网络传输
反序列化
程序
JSON 字符串
程序
其他语言

在这里插入图片描述

JSON是一种键值对格式,如下:

{
    
	"name":"小许",
	"sex" : "男",
	"age" : 18,
	"address":["北京","天津","河北"]
}

JSON格式简单、传输速度快,是数据传输的主要格式。基本上,编程语言都支持将编程语言中内置结构的数据转换为json字符串。

序列化

在不同语言中有不同的方式,下面将介绍Java与Go语言的序列化与反序列化。在Java中一切皆对象,所以序列化非常容易,直接继承java.io.Serializable。一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

public class Person implements java.io.Serializable{
    
	private int id;
	private String name;
	private String sex;
	private String address;
	
	/** 省略setter和getter */
}

继承对象后,可以调用以下函数来序列化Java对象

public final void writeObject(Object x) throws IOException

并通过以下函数反序列化

public final Object readObject() throws IOException, ClassNotFoundException

Go语言对JSON操作的包均在encoding/json包下,包下提供了Marshal方法来序列化Go内置对象。Marshal函数返回v的json编码。

func Marshal(v interface{}) ([]byte, error)

//创建结构体
type Person struct {
    
	name    string
	address string
}


//序列化
per := Person{
    
	name:    "钢铁侠",
	address: "漫威",
}
perjson, err := json.Marshal(&per)
if err != nil {
    
	panic(err)
}
fmt.Printf("per序列化的json数据为为:%v", perjson)
fmt.Printf("per序列化的json字符串为:%v", string(perjson))

在这里插入图片描述

上面的代码中序列化了一个Person对象,但是打印时打印失败。这是因为结构体成员都是小写的,只能在这个包内访问。序列化没有意义,不支持私有类的序列化。

type Person struct {
    
	Name    string
	Address string
}

将结构体改为公共类时就可以序列化了。
在这里插入图片描述

与 Java 万物皆对象的本质不同,Go 除了结构体之外,还有映射、数组、切片等。

//定义一个map类型
func initMap() map[string]string {
    
	var tmp map[string]string = map[string]string{
    }
	tmp["1"] = "aaa"
	tmp["2"] = "bbb"
	tmp["3"] = "ccc"
	return tmp
}

//对map序列化
a := initMap()

ajson, err := json.Marshal(&a)
if err != nil {
    
	panic("ajson序列化失败")
}
fmt.Printf("%v\n", ajson)
fmt.Println(string(ajson))


在这里插入图片描述

//输出序列化时的数据类型
fmt.Printf("%T\n", ajson)
fmt.Printf("%T\n", string(ajson))

在这里插入图片描述
可以看出序列化后时一个字节数组,通过string()函数将其转化为字符串,即为json字符串。

Go序列化时tag标签的使用

序列化时,成员变量的名称全部大写。但在实际使用中,需要统一的书写标准和具体的名称,这就需要在序列化时使用标签。

{
    "Name":"钢铁侠","Address":"漫威"}

Go语言结构体序列化tag使用规则是在结构体字段后添加json:"name"并用反引号包裹。

type Person struct {
    
	Name    string `json:"person_name"`
	Address string `json:"person_address"`
	Age     int
}

如果在“名称”和“地址”中使用标签,它们的序列化名称将成为自定义的 person_names。 Age成员不使用标签,因此不会改变。

per := Person{
    
	Name:    "钢铁侠",
	Address: "漫威",
	Age:     18,
}
perjson, err := json.Marshal(&per)
if err != nil {
    
	panic(err)
}
fmt.Printf("per序列化的json数据为为:%v", perjson)
fmt.Printf("per序列化的json字符串为:%v", string(perjson))

在这里插入图片描述
struct的tag只会在序列化时起作用不会影响结构体的使用。

反序列化

反序列化就是将序列化后的json字符串或者字节数组转换成编程语言内置的数据结构。这种反序列化可以在相同语言或不同语言中发生。例如Java类被序列化并通过网络传输到前端进行json反序列化,或者任何其他后端语言将内置数据序列化并传输。到前端。

反序列化序列化数据的语言相同,Java实现和Go实现。

/** go语言实现 */

//定义结构体
type Person struct {
    
	Name    string `json:"person_name"`
	Address string `json:"person_address"`
	Age     int    `json:"person_age"`
}

//序列化
per := Person{
    
	Name:    "钢铁侠",
	Address: "漫威",
	Age:     18,
}
perjson, err := json.Marshal(&per)
if err != nil {
    
	panic(err)
}
fmt.Printf("per序列化的json数据为为:%v", perjson)
fmt.Printf("per序列化的json字符串为:%v", string(perjson))

在这里插入图片描述
序列化后为一个字节数组,可以通过string()方法转化为字符串。

func json.Unmarshal(data []byte, v any) error
该方法时反序列化方法,第一个参数为需要反序列化的字节数组,第二个参数为反序列化后数据的赋值变量。

//反序列化赋值变量
var per1 Person
err1 := json.Unmarshal(perjson, &per1)
if err1 != nil {
    
	panic(err1)
}
fmt.Printf("反序列化的数据per1%s,%s,%d", per1.Name, per1.Address, per1.Age)

在这里插入图片描述

str := `{"person_name":"钢铁侠","person_address":"漫威","person_age":18}`

var per2 Person
err2 := json.Unmarshal([]byte(str), &per2)
if err2 != nil {
    
	panic(err2)
}
fmt.Println(per2)

对字符串也可以反序列化,需要将字符串转化为字节数组,通过[]byte()方法。

/** Java实现 */

//定义类实现序列化接口java.io.Serializable
public class Person implements java.io.Serializable
{
    
   public String name;
   public String address;
   public int id;
   /* getter setter toString ... */
}

//实例化类并序列化类
Person per = new Person();
per.name = "小许";
per.address = "中国";
per.id = 111111;

FileOutputStream fs = new FileOutputStream("./tmp/per.txt");
ObjectOutputStream out = new ObjectOutputStream(fs);
out.writeObject(e);
out.close();
fs.close();
System.out.printf("data is saved in ./tmp/per.txt");


//反序列化
Person e = null;
FileInputStream fileIn = new FileInputStream("./tmp/Person.txt");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Person) in.readObject();
in.close();
fileIn.close();
System.out.println("反序列化的对象",e);
System.out.println("name: " + e.name);
System.out.println("address: " + e.address);
System.out.println("id: " + e.id);

这个序列化的字节数组直接存储在文件中。一般情况下是直接通过http协议等网络传输到浏览器,由浏览器内置的解析器,即js进行反序列化。

在前后端交互的过程中主要的数据传输方式就是json字符串串,一般将后端语言的内置对象及数据结构都序列化为json字符串,再由Javascript的JSON,parse()方法将json字符串转化为js的内置对象。

JS中内置了json字符串与json数据的转化方法,因此只需要再后端语言中将内置数据序列化为json字符串即可,这个过程是统一的,因此诞生了很多序列化工具,仅需少量的代码即可序列化,如阿里巴巴的fastjson,apache的jackson等。

. . .

相关推荐

额外说明

Spring零配置下的事务实现

传统Spring框架的事务配置都是在XML配置文件中配置的,指定数据源,事务管理器,切入点等等。 那在零配置下的Spring框架中,要如何实现事务?有一个注解,@EnableTransactionManagement,这个注解能实现对标识了@Transa

额外说明

6.API(1)Activiti数据查询

1.查询对象 1.1 往ACT_ID_GROUP表来保存用户组的数据 package org.crazyit.act.c6.demo1; import org.activiti.engine.IdentityService; import org.ac

额外说明

最简单的例子解释python的转置函数

目录 一,我们要弄清楚transpose的轴是什么意思? 二,`(x,y,z)的物理含义`: 三,transpose变换的例子 四,代码验证 五,关于经过了transpose变换之后,这个三维数组的形状是如何变化确定的? 二维数组的transpose就是

额外说明

Apifox在行动——微信第三方小程序审核上线

什么是Apifox? 简单来讲就是整合了 Postman + Swagger + Mock + JMeter等几种工具,通过一套系统、一份数据,解决多个系统之间的数据同步问题。只要定义好 API 文档,API 调试、API 数据 Mock、API 自动化

额外说明

Android开发之日志记录(六)

日志级别:error > warn > information > debug > verbose   日志类型 //Log.e():error级别 Log.e("LogActivity",

额外说明

java常用正则表达式

^/d+$"  //非负整数(正整数 + 0) "^/[0-9/]*/[1-9/]/[0-9/]*$"  //正整数 "^((-/d+)/|(0+))$"  //非正整数(负整数 + 0) "^-/[0-9/]*/[1-9/]/[0-9/]*$"  //

额外说明

【Python零基础到入门】Python基础语法篇——Python 常用基础语法 速览

目录 - 前言 -Python 常用基础语法 速览 -️‍-编码 -️‍-标识符 -️‍-python保留字 -️‍-注释 -️‍-行与缩进 -️‍-多行语句 -️‍-数字(Number)类型 -️‍-字符串(String) -️‍-空行 -️‍-等待用

额外说明

多线程案例(2)-阻塞式队列

文章目录 多线程案例二 二、阻塞式队列 大家好,我是晓星航。今天为大家带来的是 多线程案例二 相关的讲解!- 多线程案例二 二、阻塞式队列 阻塞队列是什么 阻塞队列是一种特殊的队列. 也遵守 “先进先出” 的原则. 阻塞队列能是一种线程安全的数据结构,

额外说明

Nginx实现负载均衡的多种方法演示

文章目录 前言 一、什么是负载均衡 二、Nginx配置负载均衡讲解 2.1 轮询算法(默认) 2.2 IP_HASH算法 2.3 Weighted算法 2.4 URL_HASH算法 总结 前言 Nginx是一款高性能的Web服务器和反向代理服务器,它具有

额外说明

解决Windows丢失vcomp90.dll找不到

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或者损坏了,这时你只需下载这个vcomp90.dll文件进行安装(前提是找到适合的版本),当

ads via 小工具