你知道序列化可以使用代理吗伱知道序列化的安全性吗?每个java程序员都听说过序列化要存储对象需要序列化,要在网络上传输对象要序列化看起来很简单的序列化其实里面还隐藏着很多小秘密,今天本文将会为大家一一揭秘
序列化就是将java对象按照一定的顺序组织起来,用于在网络上传输或者写入存储中而反序列化就是从网络中或者存储中读取存储的对象,将其转换成为真正的java对象
所以序列化的目的就是为了传输对象,对于一些复杂的对象我们可以使用第三方的优秀框架,比如ThriftProtocol Buffer等,使用起来非常的方便
JDK本身也提供了序列化的功能。要让一个对象可序列化则可以实现");
上面的例子中,我们为CustUser添加了一个age对象,并在writeObject中对age进行了加密(加2)在readObject中对age进行了解密(减2)。
上面的例子 我们只是对age字段进行了加密,如果我们想对整个对象进行加密有没有什么好的处理办法呢
上面的例子中,我们构建了一个SealedObject对象和相应的加密解密算法
SealedObject就像是一个代理,我们写入和读取的都是这个代理的加密对象从而保证了在数据传输过程中的安全性。
上面的SealedObject实际上就是一种代理栲虑这样一种情况,如果class中的字段比较多而这些字段都可以从其中的某一个字段中自动生成,那么我们其实并不需要序列化所有的字段我们只把那一个字段序列化就可以了,其他的字段可以从该字段衍生得到
在这个案例中,我们就需要用到序列化对象的代理功能
首先,序列化对象需要实现writeReplace方法表示替换成真正想要写入的对象:
然后在Proxy对象中,需要实现readResolve方法用于从系列化过的数据中重构序列化对潒。如下所示:
注意我们写入和读出的都是CustUserV3对象。
使用SerializableJava会自动为类的对象和字段进行对象序列化,可能会占用更多空间而Externalizable则完全需偠我们自己来控制如何写/读,比较麻烦但是如果考虑性能的话,则可以使用Externalizable
另外Serializable进行反序列化不需要执行构造函数。而Externalizable需要执行构造函数构造出对象然后调用readExternal方法来填充对象。所以Externalizable的对象需要一个无参的构造函数
本文详细分析了序列化对象在多种情况下的使用,并講解了Serializable和Externalizable的区别希望大家能够喜欢。
本文作者:flydean程序那些事本文来源:flydean的博客
欢迎关注我的公众号:程序那些事更多精彩等着您!