摘自《Netty权威指南》
JDK1.1版本提供了Java序列化,只需要实现 java.io.Serializable
接口并生成序列ID即可,但是在远程服务调用(RPC)时,很少使用Java序列化进行消息的编解码和传输
无法跨语言
由于Java序列化是Java语言内部的私有协议,其它语言并不支持,对于用户来说完全是黑盒,其序列化后的字节数组,别的语言无法进行反序列化
目前几乎所有流行的Java RPC通信框架,都没有使用Java序列化,原因就是它无法跨语言,而一般情况下,RPC框架都需要支持跨语言应用
序列化后的码流太大
通过下面的例子看下Java序列化后的字节数组大小:
1 |
|
执行后的结果:1
2
3The jdk serializable length is : 106
----------------------------------------------
The byte array serializable length is : 13
可以发现,使用Java序列化后的字节数组很大,这样就导致占用空间大、网络传输更占带宽,导致系统的吞吐量降低
序列化性能太低
将上面的例子改造成性能测试版本
1 | public class JavaSerializePerformTest { |
执行结果:1
2
3The jdk serializable cost time is : 2667 ms
----------------------------------------------
The byte array serializable cost time is : 160 ms
简单的例子可以看出,Java序列化的性能很低