一、知识点介绍
1.什么是序列化与反序列化?
对象与磁盘的交互读写。
2.为什么要学?
2.1在之前的IO流中,都是内存与磁盘进行交互的读写,要传输只能在本地上进行传输。想要在网络上进行传输,那就要通过进行对象的传输,java万物皆对象嘛。
2.2更好的保存数据,防止数据的丢失。
3.序列化与反序列化?
序列化(对象字节输出流--即写入数据):Java对象数据写入到磁盘文件中。
反序列化(对象字节输入流--即读取数据):读取磁盘文件中的Java对象数据。
4.对象数据?
来自idea里面的中产生的Java数据。
二、例子
1.序列化(ObjectOutputStream)------写入磁盘文件
把代码2的数据通过代码1写入到磁盘文件中。
操作代码1(重点):
- package bao;
-
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.ObjectOutputStream;
-
- public class Test {
- public static void main(String[] args) throws IOException {
- //1.创建学生对象并写入数据
- Student s = new Student("故人","yu","9477",18);
- //2.使用对象序列化把对象数据写入到指定磁盘文件中去
- ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("D:\\java_base\\SE\\src\\bao\\风花雪月.txt"));//原先文件夹是空的
- //3.调用序列化方法
- os.writeObject(s);
- os.close();//关闭流
- }
- }
- //对象那边一定要实现implements Serializable接口
被测试的对象代码2(可看可不看):
- package bao;
-
- import java.io.Serializable;
-
- public class Student implements Serializable {//这个implements Serializable接口一定不能忘记,要不然会报错的
- //1.创建对象元素
- private String name;
- private String loginName;
- private transient String passWord;//加入了transient,就不参与序列化。别人就获取不到信息。保护了数据安全
- private int age;
-
-
- //2.生成set和get方法
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getLoginName() {
- return loginName;
- }
-
- public void setLoginName(String loginName) {
- this.loginName = loginName;
- }
-
- public String getPassWord() {
- return passWord;
- }
-
- public void setPassWord(String passWord) {
- this.passWord = passWord;
- }
-
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- //3.生成的有参构造器
- public Student(String name, String loginName, String passWord, int age) {
- this.name = name;
- this.loginName = loginName;
- this.passWord = passWord;
- this.age = age;
- }
-
- //4.生成无参构造器
- public Student() {
- }
- //5.生成toString方法
- @Override
- public String toString() {
- return "Student{" +
- "name='" + name + '\'' +
- ", loginName='" + loginName + '\'' +
- ", passWord='" + passWord + '\'' +
- ", age=" + age +
- '}';
- }
- }
- //生成的快捷键在其他文章中有
运行结果(这是运行成功的,我们看不懂很正常,这是给磁盘看的):
2.反序列化(ObjectInputStream)------读取磁盘文件
把磁盘文件中存入的对象数据读取出来。取例:读取上述"风花雪月"的对象数据出来
- package bao;
-
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
-
- public class Test {
- public static void main(String[] args) throws IOException, ClassNotFoundException {
- //1.创建要读取文件数据的对象(文件中存的数据是对象数据)
- ObjectInputStream is = new ObjectInputStream(new FileInputStream("D:\\java_base\\SE\\src\\bao\\风花雪月.txt"));//放入要读取的文件地址
- //2.调用反序列化方法
- Object s = is.readObject();
- System.out.println(s);
- }
- }
-
运行结果:
Student{name='故人', loginName='yu', passWord='null', age=18}
注意点:这个读取的文件来源是上一题(被序列化后的磁盘文件"风花雪月")
旁白:在里面用到了三份文件。
序列化:把对象文件(学生对象)写入到磁盘文件(风花雪月)中 。
反序列化:把磁盘文件(风花雪月)读取出来。
1.其实用到这个也就是为了保存我们开发中的数据保存到磁盘文件中去,防止丢失,还有网络传输对象数据会用到这个。
2.这个就是读写磁盘文件嘛,和之前不同的是,这个读写的是idea里面产生的数据文件,比如一个系统中的用户信息等。
额外扩展知识:要保护一些隐私数据防止其他人读取。就在要保护隐私的数据后面加上transient
所以上面运行出来的passWord就显示为null了。