Java序列化流和反序列化流

(一)序列化流与反序列流

【定义】

序列化流:将对象和对象的内容转换为字节保存。

反序列化流:将字节转换为对应的对象和信息。

【序列化要求】

(1)需要序列化的对象的类,必须实现 Serializable 接口,Serializable 接口是一个标记接口,接口中没有对应的方法。

补充:Cloneable也是一个标记接口,如果一个类要实现clone方法,则该类必须实现Cloneable接口

(2)最好设置serialVersionUID的值。(可以通过eclipse自动指定)

一个类在实现了 Serializable 接口后会自动根据类中的属性和方法计算出一个 serialVersionUID 值。这个 UID 会跟随对象序列化到文件中。但如果在序列化后增加了一个属性,那么会自动根据新的属性和方法计算出一个新的 UID 。在反序列化的时候,首先会获取 UID如果流中的 UID 和本地类的 UID 不同那么就会拒绝反序列化,并且抛出异常。如果序列化 UID 相同,那么就会反序列化成功。只要手动的指定了一个 UID ,那么系统就不会自动根据属性和方法计算 UID

(3)被static 修饰的属性不能被序列化。

(4)被transient 修饰的属性强制性不能序列化。

补充:集合和Map 中常用的类大多不能被序列化,因为在类中许多属性被设置为transient或者static

【为什么要使用序列化】

由定义可知,序列化是将对象和对象的内容转换为字节保存。换句话说,有些对象,我不仅把它保存在我的内存中,我还要把它保存在我的硬盘里。此时我就可以将该对象,存储在硬盘中,需要时,在进行反序列操作。

(二)序列化流与反序列流实现

【序列化操作】

public class SerializeDemo {

	public static void main(String[] args) throws IOException {
	
		//实例化对象
		Person p = new Person("张三", 18);
		//创建ObjectOutputStream对象,用于输出操作
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\person.data"));
		//将对象写入到指定文件中
		oos.writeObject(p);
		//关流
		oos.close();
		
	}
}

class Person implements Serializable{
	private static final long serialVersionUID = -6327020381644514281L;
	private String name;
	private int age;
	public Person() {
	}
	public Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	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;
	}
}
  1. 创建实体类,实现Serilizable接口(标记接口)
  2. 创建ObjectOutputStream对象,传入FileOutputStream(字节流)对象
  3. 调用writeObject()方法,传入要写入的对象 ,最后关流操作。

【反序列化】

public static void main(String[] args) throws Exception {
	
		Person p = new Person();
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\person.data"));
		p = (Person) ois.readObject();
		System.out.println(p);
		ois.close();
	}
  1. 创建ObjectInputStream对象,并且传入FileInputStream对象
  2. 调用readObject()方法,返回序列化的内容

补充:

1、使用transient修饰的属性不能被序列化,在反序列的时候,它存储的内容会为null。

2、使用static修饰的属性不能被序列化,因为static修饰的属性是共享的,他会随着我们的修改而变化

(三)持久化存储类Properties

【简介】

  1. Properties是用于做持久化存储的映射。
  2. Properties是Hashtable的子类,key和value不能为null,key和value的类型必须是String类型

【存入】

public static void main(String[] args) throws Exception {
		Properties pro = new Properties();
		//存放元素
		pro.put("Angle", "天使");
		pro.put("baby", "宝贝");
		FileOutputStream fos = new FileOutputStream("data.properties");
		// 持久化存储到文件中  持久化存储的文件必须是.properties结尾
		//参数2:对应文件的注释内容
		pro.store(fos,"simple Name");
		fos.close();
	}
  1. 声明Properties对象
  2. 调用put方法,存放对象。存放的内容不能为null,必须为String
  3. 实例化FileOutputStream对象,用以存储位置
  4. 调用Store方法,参数2:对应文件的注释内容
  5. 关流

注意:持久化存储到文件中  持久化存储的文件必须是.properties结尾

【取出】

public static void main(String[] args) throws Exception {
		Properties pro = new Properties();
		pro.load(new FileInputStream("data.properties"));
		String name = pro.getProperty("Angle");
		System.out.println(name);
	}
  1. 声明Properties对象
  2. 调用load方法,加载文件。
  3. 使用getProperty(key)方法,获取value值。
  4. 输出值

注意:如果,不存在的key,则返回null

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值