Java serialization

1. Preface

用途:
Java serialization objects can be used for persistence or network data exchange.

预热文档
http://stackoverflow.com/questions/5837698/converting-any-object-to-a-byte-array-in-java
http://www.journaldev.com/2452/java-serialization-example-tutorial-serializable-serialversionuid#serializable
http://tonl.iteye.com/blog/1948429
http://www.aijava.cn/13396.html
http://www.cnblogs.com/rollenholt/archive/2012/11/26/2789445.html

2. Serializable & Externalizable

java有2个类实现序列化 Serializable,Externalizable

2.1 Serializable

  • Serializable是一个marker interface
  • transient和static字段不能序列化, but, 可以重写writeObject()来覆盖默认行为
  • 序列化对象可以写到ObjectOutputStream中,oos可以从FileOutputStream/ByteArrayOutputStream创建。
  • serialVersionUID jvm通过反射来找,不同java编译器的默认serial uid实现不一样,明确指定的话避免解析失败. (jdk自带id生成器: serialver )
  • 如果singleton类实现了serializable,那么write/read就破坏了单例模式。but, 可以用readResolve()解决,在readResolve中直接返回INSTANCE

2.2 Externalizable

  • Externalizable是一个extends Serializable的接口
  • 可以更精细地控制序列化的过程,默认constructor会被调用

3. comparison with protobuf/json

read this first.

protobuf: 需要生成代码,需要proto工具生成代码,对象小,跨语言
serialization:对象大,只能用java,语言自带解析
json: 对象大,需要第三方库,跨语言

4. code speaks

CommitInfo.groovy
CommitInfo2.groovy
Serializer.groovy
CommitInfoTest.groovy