Java学习-IO流-序列化流
创始人
2024-05-28 13:47:04
0

Java学习-IO流-序列化流

                 字节流↙         ↘InputStream         OutputStream↓                   ↓反序列化流            序列化流
ObjectInputStream    ObjectOutputStream

序列化流

序列化流/对象操作输出流:把java中的对象写到本地文件中
public ObjectOutputStream(OutputStream out):把基本流包装成高级流
public final void writeObject(Object obj):把对象序列化(写)到文件中

public class Student {private String name;private int age;
}
Student stu = new Student("zhangsan",23);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("..\\xx.txt"));
oos.writeObject(stu);
oos.close();
//报错:NotSerializableException

解决方案:让Javabean类实现Serializable接口,没有抽象方法,标记型接口,一旦实现了这个接口,就表示当前的类可以被序列化

public class Student implements Serializable{private String name;private int age;
}
Student stu = new Student("zhangsan",23);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("..\\xx.txt"));
oos.writeObject(stu);
oos.close();

反序列化流

反序列化流/对象操作输入流:把序列化到本地文件的对象数据读取到程序中
public ObjectInputStream(InputStream in):把基本流包装成高级流
public Object readObject():把序列化到本地文件中的对象读取到程序中

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("..\\xx.txt"));
Object o = ois.readObject();
sout(o);
ois.close();

序列化流和反序列化流使用细节

版本号

将 Student 类对象 stu 序列化到本地文件后,在 Student 类中新增属性 address

public class Student implements Serializable{private String name;private int age;private String address;
}

再将 stu 反序列化到程序中时会报错
分析原因:
在类实现 Serializable 接口时,java 会根据类的属性、方法等信息计算一个 long 类型序列号,在类实例化时,对象会包含这个序列号,在对象序列化时,序列号也一起被写到本地文件中;在类新增属性后,会重新计算版本号,导致反序列化时两个版本号不一致,因此会报错
解决方案:
固定版本号
法1:

public class Student implements Serializable{private static final long serialVersionUID=1L;private String name;private int age;
}

法2:
File → Settings → 搜索 Serializable → 选中Serializable class without ‘serialVersionUID’ → 选中Transient field is not initialized deserialization → OK
未定义序列号的类会被标记,鼠标悬停时会提示:does not define a ‘serialVersionUID’ field,选中类,Alt + 回车 → Add ‘serialVersionUID’ field,自动计算版本号

@Serial
private static final long serialVersionUID = -123456789L;

验证效果
定义类

public class Student implements Serializable{private static final long serialVersionUID = -123456789L;private String name;private int age;
}

序列化对象

Student stu = new Student("zhangsan",23);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("..\\xx.txt"));
oos.writeObject(stu);
oos.close();

修改类属性

public class Student implements Serializable{private static final long serialVersionUID = -123456789L;private String name;private int age;private String address;
}

反序列化

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("..\\xx.txt"));
Object o = ois.readObject();
sout(o);
ois.close();

输出:Student{name=‘zhangsan’,age=23,address=‘null’}

限制某些属性不被序列化到本地文件

transient:瞬态关键字,不会把它修饰的属性序列化到本地文件

public class Student implements Serializable{private static final long serialVersionUID = -123456789L;private String name;private int age;private transient String address;
}

序列化对象

Student stu = new Student("zhangsan",23,"天津");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("..\\xx.txt"));
oos.writeObject(stu);
oos.close();

反序列化

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("..\\xx.txt"));
Object o = ois.readObject();
sout(o);
ois.close();

输出:Student{name=‘zhangsan’,age=23,address=‘null’}

小结

1.类应实现 Serializable 接口,否则报错 NotSerializableException
2.序列化到本地文件中的数据是不能被修改的,一旦修改无法读取
3.序列化后,修改了类,再反序列化,会报错:InvalidClassException,解决方案:SerialVersionUID
4.transient:限制某个属性不参与实例化过程

相关内容

热门资讯

节前给父母买礼物?警惕保健品骗... 年底将至,不少朋友开始计划给父母选购礼物。给父母的礼物一般以实用为主,因而不少朋友会从“健康”方面考...
跨周期调节发力 一大批重磅政策... 央视网消息:为落实中央经济工作会议部署的重点任务,12月31日上午,国家发展改革委举行新闻发布会,发...
中国证监会修改《证券期货行政执... 新华社北京12月31日电(记者刘慧、刘羽佳)中国证监会对《证券期货行政执法当事人承诺制度实施规定》进...
一揽子解决4000余起涉央视著... 寒风凛冽,北京迎来深冬。最高人民法院的那棵皂角树也褪去了旧衣,门口的接待室里来了几位“熟悉”的客人,...
南山区商事(金融)纠纷调处中心... 12月31日,深圳市南山区商事(金融)纠纷调处中心召开座谈会。南山区司法局、南山区人民法院,以及入驻...
深圳写手智能科技申请法律服务平... 国家知识产权局信息显示,深圳写手智能科技有限公司申请一项名为“法律服务平台的数据信息集成方法及系统”...
江苏博云塑业申请无氟阻燃工程塑... 国家知识产权局信息显示,江苏博云塑业股份有限公司申请一项名为“无氟阻燃工程塑料合金及其制备方法”的专...
国常会:审议通过《供水条例(草... 钛媒体App 12月31日消息,李强主持召开国务院常务会议,审议通过《供水条例(草案)》和《中华人民...
教育部出台制度规范职业教育教师... 新华社北京12月31日电(记者魏冠宇)记者从教育部获悉,教育部教师队伍建设专家指导委员会职业学校教师...
证监会:支持相关市场机构、人员... 证监会有关部门负责人答记者问。问:12月30日,五矿证券公告就广道数字虚假陈述设立先行赔付专项基金,...