序列化:ObjectOutputStream
用于对象的输出writeObject(),保存对象的各项信息
反序列化:ObjectInputStream
用于对象的读取readObject(),把之前序列化输出的数据,在程序中重新恢复成对象
注意:
1.如果一个类的对象想要被序列化,那么这个类必须实现可序列化接口
2.必须先序列化,再反序列化,并且一次序列化对应一次反序列化
3.反序列化时持有的UID必须与序列化目标类Student的UID一样,否则报错
4.反序列化时的文件路径必须与序列化时的文件路径一样
序列化是指将对象的状态信息转换为可以存储或传输形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后可以通过从存储区中读取或者反序列化对象的状态,重新创建该对象.
序列化:利用ObjectOutputStream,把对象的信息,按照固定的格式转成一串字节值输出并持久保存到磁盘
反序列化:利用ObjectInputStream,读取磁盘中之前序列化好的数据,重新恢复成对象
- 需要序列化的文件必须实现Serializable接口,用来启用序列化功能
- 不需要序列化的数据可以修饰成static,原因:static资源属于类资源,不随着对象被序列化输出
- 每一个被序列化的文件都有一个唯一的id,如果没有添加此id,编译器会自动根据类的定义信息计算产生一个
- 在反序列化时,如果和序列化的版本号不一致,无法完成反序列化
- 常用与服务器之间的数据传输,序列化成文件,反序列化读取数据
- 常用使用套接字流在主机之间传递对象
- 不需要序列化的数据也可以被修饰成transient(临时的),只在程序运行期间在内存中存在,不会被序列化持久保存
我们在反序列化时,JVM会拿着反序列化流中的serialVersionUID与序列化时相应的实体类中的serialVersionUID来比较,如果不一致,就无法正常反序列化,出现序列化版本不一致的异常InvalidClassException。
而且我们在定义需要序列化的实体类时,如果没有手动添加UID,
Java序列化机制会根据编译的class自动生成一个,那么只有同一次编译生成的class才是一样的UID。
如果我们手动添加了UID,只要这个值不修改,就可以不论编译次数,进行序列化和反序列化操作。
foreach循环高效for循环foreach循环
- 好处:比普通for循环写法简单,而且效率高
- 坏处:没有办法按照下标来操作值,只能从头到尾依次执行
- 语法:for(1 2: 3){循环体}
- 3-要遍历的数据 1-每轮遍历到的数据的类型 2-变量名,可以随意起名
for (E a:
e) {
System.out.println(a);
}
泛型
/泛型可以实现通用代码的编写,用E表示元素的类型时Element元素
* 泛型的语法要求:如果在方法上使用泛型,必须两处同时出现
* 一个是传入参数要求为泛型,一个是返回值前的泛型类型,这表示一个泛型方法/
private staticvoid print(E[] e) { // for (int i = 0; i < e.length; i++) { // System.out.println(e[i]); // } for (E a: e) { System.out.println(a); } }
*泛型通常与集合一起使用,用来约束集合中元素的类型
- 泛型的好处:可以约束集合数据类型,把报错的时机提前,而不是运行时才报错
- 在向集合中添加元素时,会先检查元素的数据类型,不是要求的类型就会编译失败
Listlist1 = new ArrayList(); list1.add("泡泡");



