1-Web安全——序列化和反序列化

Posted songly_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1-Web安全——序列化和反序列化相关的知识,希望对你有一定的参考价值。

1. 什么是序列化和反序列化

一个程序在执行过程中通常会产生新的数据,这些数据会临时保存在内存中,有时候我们希望程序运行结束后能够持久化保存数据,这就会涉及到数据形式转换问题,而把内存中的数据转换为可以保存或可传输的过程就是序列化。

现在反过来理解,把保存或传输的数据加载到内存,还原成运行程序中的具体的数据类型变量的过程就是反序列化。

2. 理解序列化和反序列化

我们通过一个C语言的案例来理解序列化和反序列化。

例如把一个班级的学生的数据保存到文件中,每一个学生有学号id,名字,成绩等信息,在C语言中先定义一个学生的结构体,具体信息如下:

struct student{
	int id;
	char name[32];
	float score;
};

但是程序运行的数据和文件中保存的数据格式是不一样的,如果要把程序运行的数据保存到文件中就会涉及到一个数据转换的问题。

程序会依次访问结构体student的每个成员信息并把数据以某种格式写入到文件中,最终保存到文件中:

程序从文件中读取数据时,也需要通过定义数据类型变量结构体student把数据取出来,这就是序列化和反序列化的过程。

C语言序列化和反序列化代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

//数据类型student
struct student{
	int id;
	char name[32];
	float score;
};

//反序列化:文件的数据 ------>  struct student
void student_unserialize(const char* file_name){
	struct student stu;
	FILE *file = fopen(file_name, "rt");
	if(file == NULL){
		perror("open file failed:stu.txt");
		return;
	}
	printf("============student name==========\\n");
	while(1){
		if(EOF == fscanf(file, "%d %s %f", &stu.id, stu.name, &stu.score)){
			break;
		}
		printf("%d %s %.2f\\n", stu.id,stu.name,stu.score);
	}
	fclose(file);
}

//序列化:struct student  ------>  文件的数据
void student_serialize(const char* file_name){
	struct student stus[3] = { {10 , "liubei" , 66.5},{11 , "caocao" , 76.5},{12 , "sunquan" , 88.5}};
	FILE *file = fopen(file_name , "wt");
	if(file == NULL){
		perror("open file failed:stu.txt");
		return;
	}
	int i = 0;
	for(i=0; i < 3; i++){
		fprintf(file, "%d %s %f\\n", stus[i].id, stus[i].name, stus[i].score);
	}
	fclose(file);
}

int main(void){
	student_serialize("stu.txt");
	student_unserialize("stu.txt");
	return 0;
}

3. 序列化和反序列化的应用场景

1. 将内存中的对象持久化存储到文件中。

2. 程序之间数据传递过程中通常会以一种特定的数据格式传输,序列化和反序列化就是对数据传输的格式进行转换,例如在网络编程中,客户端通常会把字符串格式的数据转成二进制的字节流数据传输(序列化),服务端收到数据后再转换成字符串格式的数据(反序列化)。

以上是关于1-Web安全——序列化和反序列化的主要内容,如果未能解决你的问题,请参考以下文章

Java反序列化安全漏洞怎么回事

使用 Kryo 完成 序列化和反序列化,并使用ThreadLocal解决线程不安全问题

转载序列化和反序列化

RestFramework

序列化和反序列化代码

使用 system.text.json 序列化和反序列化流