【Java】序列化对象基础——核心细节

目录

前言

标记接口:Serializble

serialVersionUID版本号

 序列化注意事项

序列化与反序化

瞬态关键字:transient


前言

序列化对象,无非就是对对象的持久化存储。

序列化常用存取类:序列化类(ObjectOutputStream),反序列化类(ObjectInputStream)。

标记接口:Serializble

要序列化的类必须实现该接口,该接口没有任何方法和字段,仅用于标识可序列化的语句。

serialVersionUID版本号

下面是JDK1.6中文文档的一段话:序列化时注意事项

 序列化注意事项

也就是说:在反序列化过程用于验证与目标类是否兼容。

比如:我对一个类进行序列化持久存储,此时我对此类添加或删除了某些属性重新编译,反序列化持久化对象时验证UID版本号发现不等,抛出InvalidClassException异常。

为什么强烈建议我们显示声明serialVersionUID值?因为在不同平台中的JVM虚拟机算法计算的serialVersionUID值可能略有不同,所以在跨平台的系统运行程序反序列化过程中可能抛出InvalidClassException异常。

序列化与反序化

先看常用构造

都是接收一个流

Test.java

package com.bin.demo;

import java.io.Serializable;

public class Test implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private String name;
	private int age;
	
	public void setNmae(String name) {
		this.name = name;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "名字 = " + name + "、 年龄 = " + age;
	}

}

main方法

//首先需要一个对象
Test t = new Test();
t.setNmae("超人");
t.setAge(2);

File file = new File("F:\\" + t.getClass().getSimpleName() + ".object"); //目的地

//序列化对象
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file)); //输出流默认会创建目的并覆盖
out.writeObject(t); //写入对象
out.flush(); //刷新缓冲区
out.close();

//反序列化对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
if (file.exists()) { //只有文件存在才读取
	Test t2 = (Test) in.readObject(); //读取对象并转换类型
	System.out.println(t2.toString()); //输出内部数据
}
in.close();

输出:

名字 = 超人、 年龄 = 2

瞬态关键字:transient

短暂瞬间的意思:只能在内存中的生命,而不是持久化。

使用此关键字修饰的变量将在序列化过程中不进行持久化存储。同static静态关键字,也是在序列化过程中不进行持久化存储的。因为static静态的成员不可能出现在堆内存中,按照面向对象思想静态是属于类的,对象公有的。

发布了27 篇原创文章 · 获赞 33 · 访问量 9497

猜你喜欢

转载自blog.csdn.net/qq_42470947/article/details/104623839
今日推荐