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

前言

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

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

标记接口:Serializble

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

1. serialVersionUID 版本号

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

2. 序列化注意事项

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

比如:我对一个类进行序列化持久存储,此时我对此类添加或删除了某些属性重新编译,反序列化持久化对象时验证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静态的成员不可能出现在堆内存中,按照面向对象思想静态是属于类的,对象公有的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚妄狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值