序列化

5 篇文章 0 订阅

概述

Java 提供了⼀种对象序列化的机制。⽤⼀个字节序列可以表示⼀个对象,该字节序列包含该 对象
的数据 、 对象的类型 和 对象中存储的属性 等信息。字节序列写出到⽂件之后,相当于⽂件中持久
保存了⼀个对象的信息。

反之,该字节序列还可以从⽂件中读取回来,重构对象,对它进⾏反序列化。 对象的数据 、 对象
的类型 和 对象中存储的数据 信息,都可以⽤来在内存中创建对象。看图理解序列化:

在这里插入图片描述

ObjectOutputStream类

java.io.ObjectOutputStream 类,将Java对象的原始数据类型写出到⽂件,实现对象的持久存储。

构造⽅法

public ObjectOutputStream(OutputStream out) :创建⼀个指定OutputStream的ObjectOutputStream。

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(“employee.txt”));

序列化操作

  1. ⼀个对象要想序列化,必须满⾜两个条件:
    1.1该类必须实现 java.io.Serializable 接⼝, Serializable 是⼀个标记接⼝,不实现此接⼝的类将不会使任何状态序列化或反序列化,会抛出 NotSerializableException 。
    1.2该类的所有属性必须是可序列化的。如果有⼀个属性不需要可序列化的,则该属性必须注明
    是瞬态的,使⽤ transient 关键字修饰
public class Employee implements java.io.Serializable {
 // 加⼊序列版本号
 private static final long serialVersionUID = 1L;
 public String name;
 public String address;
 public transient int age; // transient瞬态修饰成员,不会被序列化
 public void addressCheck() {
 System.out.println("Address check : " + name + " -- " + address);
 }
}

2.写出对象⽅法
public final void writeObject (Object obj) :将指定的对象写出。

public class SerializeDemo{
 public static void main(String [] args) {
 Employee e = new Employee();
 e.name = "zhangsan";
 e.address = "hangzhou";
 e.age = 20;
 try {
 // 创建序列化流对象
  ObjectOutputStream out = new ObjectOutputStream(new
FileOutputStream("employee.txt"));
 // 写出对象
 out.write(e);
 // 释放资源
 out.close();
 fileOut.close();
 System.out.println("Serialized data is saved"); // 姓名,地址被序列化,
年龄没有被序列化。
 } catch(IOException i) {
 i.printStackTrace();
 }
 }
}
输出结果:
Serialized data is saved

ObjectInputStream类

ObjectInputStream反序列化流,将之前使⽤ObjectOutputStream序列化的原始数据恢复为对象。
public final Object readObject () :读取⼀个对象。

public class DeserializeDemo {
 public static void main(String [] args) {
 Employee e = null;
 try { 
 // 创建反序列化流
 ObjectInputStream in = new ObjectInputStream( new FileInputStream("employee.txt"));
 // 读取⼀个对象
 e = (Employee) in.readObject();
 // 释放资源
 in.close();
 fileIn.close();
  } catch(IOException i) {
 // 捕获其他异常
 i.printStackTrace();
 return;
 } catch(ClassNotFoundException c) {
 // 捕获类找不到异常
 System.out.println("Employee class not found");
 c.printStackTrace();
 return;
 }
 // ⽆异常,直接打印输出
 System.out.println("Name: " + e.name); // zhangsan
 System.out.println("Address: " + e.address); // hangzhou
 System.out.println("age: " + e.age); // 0
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值