`
中国爪哇程序员
  • 浏览: 164775 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java 序列化

    博客分类:
  • java
 
阅读更多
java序列化,是把对象序列化成流,转成流的目的是为了网络传输。
在什么场合要网络传输java对象呢?
我大概总结了两种:java对象持久化,java对象远程服务调用。
java对象持久化,如redis缓存服务,把对象序列化到redis内存服务器中,持久到内存。
java对象远程服务调用,例如RMI。当然也可以用mina或者netty建立网络连接,自己定义序列化与反序列操作。

这里想提的一个问题是序列化对象还是序列字符串?
这个问题具体是,例如远程服务调用,把处理结果封装成一个对象,然后序列化给client,还是把处理结果转成xml/json字符串再返回给客户端。
其实在java当中,String类也是一个对象,而且查看JDK源码,它本身也实现了java.io.Serializable接口,同样java的八个基本类型,同样也实现了java.io.Serializable接口。

其实这个选择是值到考虑的。
列举XML/JSON字符串格式的优缺点
优点:
1.一般不会发生序列化的异常,相比较要序列化对象,网络传输的对象都要实现java.io.Serializable接口,而且某些开源序列化代码不能保证对象序列化的正确性,如Hessian.
2.不用考虑serialVersionUID变更带来的影响。
3.返回内容很复杂,并非由一个对象直接转成JSON或者XML,那么用JSON/XML工具类可以动态的扩展。
4。客户端拿到字符串可以用格式化工具(浏览器一般都会有对JSON,XML)清晰的显示。
缺点:
最主要的是客户端需要解析XML/JSON,要明白字符串的结构。

相对对象的优缺点:
与XML/JSON正好相对。
优点:通过serialVersionUID可以有比较良好的版本控制。调用方直接拿到对象,不需要二次处理。


笔者感觉:
对外服务,不是平台内部调用,采用XML/JSON这种方式,而且是发部HTTP服务,而且不是甚于socket的服务调用。原因是外部调用有不可预期性,调用者过多,socket连接成本过高,而且耦合性也太高。在采用XML/JSON的场合,建立可以提供一些解析工具类,方便客户端拿到字符串转成java对象。而且client调用也比较方便。
平台系统间,模块间的相互调用可以采用序列化对象的方式。

第二个问题。
序列化的性能考虑:
笔者主要相到两个方面,decode,encode的效率,网络传输成本。
具体生成序列化的字节码效率,以及生成字节码的大小。在网络带宽相同的场合,网络传输的量越小越好。
所以用JDK,CGLIB, JAVAASSIST ,JAVAASSIST Bytecode , ASM Bytecode ,hessian做了测试。
这些开源框架都可以序列化java对象。





分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics