Java基础笔记30-流写对象
- 通过流的形式将自定义对象写到指定的文件中,该形式称为持久化存储(大白话:就数据本地存储)
- 关键词:
- ObjectInputStream 对象转转换为流读取
- ObjectOutputStream 对象转换为流输出
- Serializable 序列化类
对象输出流代码示例:
定义一个User对象
public class User{
private String name;
private int age;
User(){}
public User(String name, int age) {
super();
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;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
对对象进行对象输出流转换存储
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
public class ObjectToStream {
public static void main(String[] args) throws IOException {
objectToStreamMethod();
}
public static void objectToStreamMethod() throws IOException {
//File file = new File("E:/test.txt");
User user = new User("xiaoming",12);
//获取对象的输出流,写对象
OutputStream os = new FileOutputStream("E:/user.txt");
//将获取到的输出流转换为对象输出流
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(user);
oos.close();
os.close();
}
}
-
直接运行时会报异常:java.io.NotSerializableException 未序列化异常
-
序列化其实就是为要写的对象一个标识符,在java中对应将对象转成流的形式写入到指定文件中
-
可序列化的内容有:对象的默认序列化机制写入对象的类,类签名以及所有非瞬态和非静态字段的值
-
使用方式:只需要实体类实现一个名叫Serializable接口即可
import java.io.Serializable;
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private int age;
public User(){}
public User(String name, int age) {
super();
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;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
- 在将对象序列化之后存入文件中,根据标识符,再将文件中的内容读取出来重新包装成对象的过程,称为 反序列化 。
public static void streamToObjectMethod() throws IOException, ClassNotFoundException {
InputStream is = new FileInputStream("E:/user.txt");
ObjectInputStream ois = new ObjectInputStream(is);
//读对象,将读取到的信息转换为对象
Object obj = ois.readObject();
//再将对象类型转换为User类型,强制类型转换
User user = (User)obj;
System.out.println(user);
ois.close();
is.close();
}
输出:
User [name=xiaoming, age=12]
- 实体类中需要指定seriaVersionId,若未指定,在持久化存储后,一旦实体类做了修改,那么反序列化时就会报错