序列化和反序列化
- 序列化和反序列化
- 将内存中的java对象-数据信息传输到硬盘文件,,,这个过程叫做序列化Serialize( 拆分对象)。java对象存储到文件中,将java对象的状态保存下来的过程-----ObjectOutputStream
- 将硬盘文件中的java对象-数据信息恢复到内存中,,,,,这个过程叫做反序列化DeSerialize(组装对象)。将硬盘上的数据重新恢复到内存当中,恢复成java对象----- ObjectInputStream
- 序列化的实现
- 反序列化的实现
- 参与序列化和反序列化的对象,必须实现Serializable接口
- 注意:通过源代码发现,Serializable接口只是一个标志接口
“”" public interface Serializable { } “”" 这个接口当中什么代码都没有,起到一个标识、标志的作用,java虚拟机看到这个类实现了这个接口,可能会对这个类进行特殊处理。 Serializable这个标志接口是给java虚拟机参考的,java虚拟机看到这个接口之后,会为该类自动生成一个序列化版本号,这里没有手动写出来,java虚拟机会默认提供这个序列化版本号 - 序列化多个对象
- 可以,可以将对象放到集合当中,序列化集合。
- 提示
- 参与序列化的ArrayList集合以及集合中的元素都需要实现java.io.Serializable接口
- transient关键字
- 为了将某个关键字不序列化,可以采用transient.
- transient表示游离,不参与序列化。例如private transient String name;//name不参与序列化
- 序列化版本号的作用
- 假如原先写了一个类,过了很久,这个类源代码改动了。源代码改动之后,需要重新编译,编译之后生成了全新的字节码文件。并且class文件再次运行的时候,java虚拟机生成的序列化版本号也会发生相应的改变
- java语言中是采用什么机制来区分类的?
- 第一:首先通过类名进行比对,如果类名不一样,肯定不是同一类
- 第二:如果类名一样,再怎么进行类的区别?靠序列化版本号进行区分
- 小明写了a类,小华写了a类。对于java虚拟机来说,java虚拟机是可以区分开这两个类的,因为这两个类都实现了Serializable接口,都有默认的序列化版本号,他们的序列化版本号是不一样,所以区分开了。(这是自动生成序列化版本号的好处)
- 自动生成序列化版本号的缺陷?
- 这种自动生成的序列化版本号缺点是:一旦代码确定之后,不能进行后续的修改。因为只要修改,必然会重新编译,此时会生成全新的序列化版本号。这个时候java虚拟机会认为这是一个全新的类。(这样就不好了)
- 最终结论
- 凡是一个类实现了Serializable接口,建议给该类提供一个固定不变的序列化版本号。这样,以后这个类即使代码修改了,但是版本号不变,java虚拟机会认为是同一个类。
- eg:
- private static final long serialVersionUID = 1L; //java虚拟机识别一个类的时候先通过类名,如果类名一致,在通过序列化版本号
IO和Properties联合使用
- IO和Properties联合使用
- IO流:文件的读和写
- Properties:是一个Map集合,key和value都是String类型
- 以后经常改变的数据,可以单独写到一个文件中,使得程序动态读取,将来只需要修改这个文件的内容,java代码不需要改动,不需要重新编译,服务器也不需要重启,就可以拿到动态的信息。------配置文件
- 当配置文件中的内容格式为key=value的时候,将这种配置文件叫做属性配置文件
- java规范中要求:属性配置文件建议以.properties结尾,但这不是必须的。
- 这种以.properties结尾的文件在java中被称为:属性配置文件。其中Properties对象是专门存放属性配置文件内容的一个类
- 在属性配置文件中,#号是注释
- 在属性配置文件中,key和value之间最好不要有空格
|