目录
1.基本介绍
- 功能,提供了对基本类型或对象类型的序列化和反序列化的方法。
- ObjectOutputStream提供序列化功能。
- ObjectInputStream提供反序列化功能。
2.ObjectOutputStream序列化
1.ObjectOutputStream_.java
- //序列化后,保存的文件格式,不是存文本,而是按照他的格式来保存
package com.outputstream;
import java.io.*;
/**
* @version 1.0
* @auther Demo龙
* 演示ObjectOutputStream的使用, 完成数据的序列化
*/
public class ObjectOutputStream_ {
public static void main(String[] args) throws IOException {
//序列化后,保存的文件格式,不是存文本,而是按照他的格式来保存
String filePath = "e:\\data.dat";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
//序列化数据到 e:\data.dat
oos.writeInt(100);// int -> Integer (实现了 Serializable)
oos.writeBoolean(true);// boolean -> Boolean (实现了 Serializable)
oos.writeChar('a');// char -> Character (实现了 Serializable)
oos.writeDouble(9.5);// double -> Double (实现了 Serializable)
oos.writeUTF("Demo龙龙咯嘛");//String
//保存一个dog对象
oos.writeObject(new Dog("旺财", 10, "日本", "白色"));
oos.close();
System.out.println("数据保存完毕(序列化形式)");
}
}
2.Master.java
package com.outputstream;
import java.io.Serializable;
/**
* @version 1.0
* @auther Demo龙
*/
public class Master implements Serializable {
}
3.Dog.java
- //序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员
- //序列化对象时,要求里面属性的类型也需要实现序列化接口
- //serialVersionUID 序列化的版本号,可以提高兼容性
package com.outputstream;
import java.io.Serializable;
/**
* @version 1.0
* @auther Demo龙
*/
public class Dog implements Serializable {
private String name;
private int age;
//序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员
private static String nation;
private transient String color;
//序列化对象时,要求里面属性的类型也需要实现序列化接口
private Master master = new Master();
//serialVersionUID 序列化的版本号,可以提高兼容性
private static final long serialVersionUID = 1L;
public Dog(String name, int age, String nation, String color) {
this.name = name;
this.age = age;
this.color = color;
this.nation = nation;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
", color='" + color + '\'' +
'}' + nation + " " +master;
}
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;
}
}
演示结果
3.ObjectInputStream反序列化
- 读取(反序列化)的顺序需要和你保存数据(序列化)的顺序一致,否则会出现异常。
- 如果我们希望调用Dog的方法, 需要向下转型.。
- dog 的编译类型是 Object , dog 的运行类型是 Dog.。
- 需要我们将Dog类的定义,放在到可以引用的位置。
package com.inputstream;
import com.outputstream.Dog;
import java.io.*;
/**
* @version 1.0
* @auther Demo龙
*/
public class ObjectInputStream_ {
public static void main(String[] args) throws Exception {
//指定反序列化的文件
String filePath = "e:\\data.dat";
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
//读取
//1. 读取(反序列化)的顺序需要和你保存数据(序列化)的顺序一致
//2. 否则会出现异常
System.out.println(ois.readInt());
System.out.println(ois.readBoolean());
System.out.println(ois.readChar());
System.out.println(ois.readDouble());
System.out.println(ois.readUTF());
//dog 的编译类型是 Object , dog 的运行类型是 Dog
Object dog = ois.readObject();
System.out.println("运行类型=" + dog.getClass());
System.out.println("dog信息=" + dog);//底层 Object -> Dog
//1. 如果我们希望调用Dog的方法, 需要向下转型
//2. 需要我们将Dog类的定义,放在到可以引用的位置
Dog dog2 = (Dog)dog;
System.out.println(dog2.getName()); //旺财..
//关闭流, 关闭外层流即可,底层会关闭 FileInputStream 流
ois.close();
}
}
演示结果
本文含有隐藏内容,请 开通VIP 后查看