Java 反序列化分析从入门到放弃(一)

       学习反序列化之前需要了解一些基础知识。
在这里插入图片描述

一、序列化和反序列化

       Java 序列化是指把 Java 对象转换为字节序列的过程;Java 反序列化是指把字节序列恢复为 Java 对象的过程。对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一种序列化的形式用于存储传输。反序列化就是根据这些保存的信息重建对象的过程。
可以参考:https://xz.aliyun.com/t/6787
为了方便理解,我对在同一个默认包下,存在的User类和Serialize_test_1类的代码进行了注释:

User 类:

import java.io.Serializable;


public class User implements Serializable {
   
   
		//定义类的私有属性name
        private String name;
        //定义setName方法
        public void setName(String name) {
   
   
        	//当前类User的name等于setName传递进来的name
        	this.name = name;
        }
        //定义getName方法,返回name值
        public String getName() {
   
   
        	return name;
        }

}

Serialize_test_1 类::

import java.io.*;

public class Serialize_test_1 {
   
   
	//序列化,返回值为字节类型,输入值为对象Object
	public static byte[] serialize(final Object obj) throws Exception {
   
   
		//创建字节数组输出流实例 btout,将所有发送到输出流的数据保存在该字节数组缓冲区中, 个人理解就是读数据并放入缓存区,读的数据以字节类型的数组保存在缓冲区
		ByteArrayOutputStream btout = new ByteArrayOutputStream();
		//创建objOut 对象输出流实例,也是类似以上的读数据,不过操作的是对象流,不是字节流,序列化对项的类,使其变得可以传输,操作
		ObjectOutputStream objOut = new ObjectOutputStream(btout);
		//调用对象输出为流的对象方法
		objOut.writeObject(obj);
		return btout.toByteArray();
	}
	//反序列化,返回值类型为对象类型,输入为字节类型
	public static Object unserialize(final byte[] serialized) throws Exception {
   
   
		ByteArrayInputStream btin = new ByteArrayInputStream(serialized);
		ObjectInputStream objIn = new ObjectInputStream(btin);
		return objIn.readObject();
	}
	public static void main(String[] args) throws Exception {
   
   
		//实例化对象user,并设置其私有变量name值为posty
		User user = new User();
		user.setName("posty");
		//序列化对象
		byte[] serializeData = serialize(user);
		//文件流,创建文件user.bin并写序列化后的数据
		FileOutputStream fout = new FileOutputStream("user.bin");
		fout.write(serializeData);
		fout.close();
		// (User)表示把反序列化后的对象转为User对象,并赋值给已经声明为User类的变量user2
		User user2 = (User) unserialize(serializeData);
		//调用User的getName方法
		System.out.print(user2.getName());
	}
	
}

二、Java 方法重写

       在Java中,如果在⼦类中有和⽗类同名的⽅法,则通过⼦类实例去调⽤⽅法时,会调⽤ ⼦类的⽅法⽽不是⽗类的⽅法,这个特点称之为⽅法的重写(

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值