Java的序列化流程如下: Java的反序列化流程如下: 注意:并不是所有类都需要进行序列化,主要原因有两个 1)安全问题。 Java中有的类属于敏感类,此类的对象数据不便对外公开,而序列化的对象数据很容易进行破解,无法保证其数据的安全性,因此一般这种类型的对象不会进行序列化。 2)资源问题。可以使用序列化字节流创建对象,而且这种创建时不受限制的,有时过多地创建对象会造成很大的资源问题,因此此类对象也不适宜进行序列化。 Serializable Serializable是 Java提供的一个序列化接口,它是一个空接口,专门为对象提供标准的序列化跟反序列化操作。 序列化过程: 反序列化过程:
对象序列化时并不是所有成员都要转换成二进制的字节序列,因为为了节省存储或传输空间以及提高序列化效率,有些不必要的成员是无需序列化的。其中包括:
如果对一个实现了Serializable的类进行序列化操作,则同时对它的引用类进行序列化操作。如果引用类没有实现Serializable接口,JVM会抛出java.io.NotSerializableExeception. 此时对Person类进行序列化操作,则会同时对Tool类进行序列化操作。若Tool类没有实现Serializable接口,则会抛出异常。
Java提供了一套有效的机制,允许在序列化和反序列化时,使用定制的方法进行相应的处理。当传输双方协定好序列化策略后,只需要在需要传输的序列化类中添加一组方法来实现这组策略,在序列化时会自动调用这些规定好的方法进行序列化和反序列化。方法如下: 1)private void writeObject(ObjectOutputSteam out) throws IOException 在方法的内部有重要的代码:out.defaultWriteObject() //将对象数据以默认方式写入到输出流中 2)private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException 同样的,此方法内部也有相似代码:in.defaultReadObject(); //以默认方式从输入流中恢复对象 这两个方法的作用分别是将特定的对象写入到输出流中以及从输入流中恢复特定的对象,通过这两个方法,用户即可实现自定义的序列化。当在实现Serializable接口的类中写了上面两个方法之后,序列化或反序列化该类时则会 通过反射 来调用这两个方法,从而实现自定义序列化。 我们看下面的单例模式: 此时通过反序列化获取实例,则 单例模式会失效 。那该如何解决这个问题呢? Java有一种机制,可以让我们在序列化和反序列化时,可以根据自己的需要,写入或读取指定的实例。使用这种机制,需要在实现Serializable接口的类中添加两个方法:
再看使用了该机制的单例模式: 学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:454297367【长按复制】 我们一起学Java! |
|