Java对象序列化和反序列化

序列化和反序列化是java中进行数据存储和数据传输的一种方式
1) 对象序列化: 将对象转化为字节的过程
2) 对象反序列化: 将字节转化为对象的过程
说明: 在当前软件行业中有时也会将对象转换为字符串的过程理解为序列化, 例如将对象转换为json格式的字符串

序列化的应用场景
1) 网络通讯(C/S): 以字节方式在网络中传输数据
2) 数据存储(例如文件, 缓存)
说明: 项目一般用于"存储数据的对象"通常会实现序列化接口, 便基于java中的序列化机制对对象进行序列化操作

例如
1) tomcat中session对象的序列化(钝化)和反序列化(活化)
2) mybatis中缓存对象的序列化(对象存储到缓存)和反序列化

对象的序列化和反序列化实现(重点)
java中实现序列化和反序列化一般要遵循一下几个步骤
1) 对象要直接或间接继承 Seiralizable 接口
2) 添加序列化id(为反序列化提供保障)
3) 借助对象流对象实现序列化和反序列化

说明: 
1) Serializable 接口只是一个标识性作用
2) 建议实现序列化接口的类自动生成一个序列化ID, 加如没有在类中显示的添加此ID, 不会影响对象的序列化, 但可能会影响反序列化(对象结构发生变化时)
3) 系统底层会基于类的结构信息自动生成序列化id
4) 序列化和反序列化的顺序应该是一致的, 先序列化谁就先反序列化谁(一次序列化多个对象时)

package com.bingo.frame.oop.serial;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * |案例分析: 对象序列化
 * 1) 将一个Message对象序列化到未见
 * 2) 从文件反序列化一个对象
 * @author bingo
 */

class Bingo implements Serializable{
	//不添加序列化ID默认根据类的结构信息生成, 当类的结构信息发生变化, 从文件反序列化会失败
	private static final long serialVersionUID = 11111111111111111L;
	private String name;
	private int age;
	private transient String iDCard;//transient关键字修饰的成员不会被序列化
	private static String password;//static修饰的静态变量天然就是不可序列化
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getiDCard() {
		return iDCard;
	}

	public void setiDCard(String iDCard) {
		this.iDCard = iDCard;
	}

	public static String getPassword() {
		return password;
	}

	public static void setPassword(String password) {
		Bingo.password = password;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	@Override
	public String toString() {
		return "Bingo [name=" + name + ", age=" + age + ", iDCard=" + iDCard + ", getClass()=" + getClass()
				+ ", hashCode()=" + hashCode() + ", toString()=" + super.toString() + "]";
	}
}

public class TestSerializable01 {
	//对象序列化
	static void serialize(Object object, File file) throws IOException {
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
		oos.writeObject(object);
		oos.close();
		System.out.println("序列化OK");
	}
	//对象反序列化
	static Object deserialize(File file) throws FileNotFoundException, IOException, ClassNotFoundException {
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
		Object object = ois.readObject();
		ois.close();
		System.out.println("反序列化OK");
		return object;
	}
	public static void main(String[] args) throws Exception {
		//1.构建Bingo对象
		Bingo bingo = new Bingo();
		bingo.setName("阿斌");
		bingo.setAge(28);
		bingo.setiDCard("123456");
		bingo.setPassword("000000");
		//2.将对象序列化到文件
		File file = new File("bingo.txt");//默认项目根目录,刷新项目可以看到
		serialize(bingo, file);
		//3.从文件进行反序列化
		Object deserialize = deserialize(file);
		System.out.println(deserialize instanceof Bingo);//true
		System.out.println(deserialize.toString());
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值