Java序列化技术性能分析(JDK原生与Protostuff)
2016-12-19 23:33
627 查看
熟悉Java的朋友应该知道Java有一个叫序列化的技术,即把一个Object转换为可保存,可传输的流数据。相应的,同时存在反序列化,即将流数据转换为Object类,而在转换的过程中,该Object保持者其自身的状态。不会应该序列化或者反序列化而丢失。通常在缓存中,RPC(远程调用),或者长久保存会话信息时,大有用处。
关于序列化的时候,大部分情况下想到的是对于需要序列化的对象实现Serializable标志接口,同时为该对象提供一个唯一的serialVersionUID。
示例代码
看起来使用JDK提供的序列化技术没有什么问题,其实不然。JDK提供的序列化技术相对而已效率较低。在转换二进制数组过程中空间利用率较差。github上有个专门对比序列化技术做对比的数据:https://github.com/eishay/jvm-serializers/wiki
其中看的出来性能最优的为google开发的colfer 。这个框架尽管性能优秀,但它太过于灵活,灵活到Schema都要开发者自己指定,所以对开发者不是很友好。我推荐使用Protostuff,其性能稍弱与colfer,但对开发者很友好,同时性能远远高于JDK提供的Serializable。
添加依赖:
简单使用:
关于序列化的时候,大部分情况下想到的是对于需要序列化的对象实现Serializable标志接口,同时为该对象提供一个唯一的serialVersionUID。
示例代码
public class Person implements Serializable { private static final long serialVersionUID = -763618247875550322L; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class WhySerialversionUID { public static void main(String[] args) throws Exception { //这里是把对象序列化到文件 Person crab = new Person(); crab.setName("kaka"); ObjectOutputStream oo = new ObjectOutputStream (new FileOutputStream("kakaFile")); oo.writeObject(crab); oo.close(); //这里是把文件序列化到对象 ObjectInputStream oi = new ObjectInputStream (new FileInputStream("kakaFile")); Person kaka = (Person) oi.readObject(); //输出为Hi, My name is kaka System.out.println("Hi, My name is " + kaka.getName()); oi.close(); } }
看起来使用JDK提供的序列化技术没有什么问题,其实不然。JDK提供的序列化技术相对而已效率较低。在转换二进制数组过程中空间利用率较差。github上有个专门对比序列化技术做对比的数据:https://github.com/eishay/jvm-serializers/wiki
其中看的出来性能最优的为google开发的colfer 。这个框架尽管性能优秀,但它太过于灵活,灵活到Schema都要开发者自己指定,所以对开发者不是很友好。我推荐使用Protostuff,其性能稍弱与colfer,但对开发者很友好,同时性能远远高于JDK提供的Serializable。
添加依赖:
<dependency> <groupId>io.protostuff</groupId> <artifactId>protostuff-core</artifactId> <version>1.4.4</version> </dependency> <dependency> <groupId>io.protostuff</groupId> <artifactId>protostuff-runtime</artifactId> <version>1.4.4</version> </dependency>
简单使用:
private static RuntimeSchema<Person> schema = RuntimeSchema.createFrom(Person.class); /** *序列化 */ Person crab = new Person(); crab.setName("kaka"); //参数三缓冲器 byte[] bytes = ProtostuffIOUtil.toByteArray(crab,schema,LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE)); /** *反序列化 */ // 空对象 Person newCrab = schema.newMessage(); ProtostuffIOUtil.mergeFrom(bytes,newCrab,schema); System.out.println("Hi, My name is " + newCrab.getName());
相关文章推荐
- Java序列化技术性能分析(JDK原生与Protostuff)
- Java序列化技术性能分析(JDK原生与Protostuff)
- 序列化框架的使用及性能对比Kryo、Hessian、Protostuff、java原生
- 序列化框架性能对比(kryo、hessian、java、protostuff)
- java序列化框架性能对比(kryo,hessian,Protostuff)
- [java]序列化框架性能对比(kryo、hessian、java、protostuff)
- 【Java.ThirdParty】序列化框架性能对比(kryo、hessian、java、protostuff)
- 序列化框架性能对比(kryo、hessian、java、protostuff)
- 【转载】序列化框架性能对比(kryo、hessian、java、protostuff)
- 序列化框架性能对比(kryo、hessian、java、protostuff)
- 序列化框架性能对比(kryo、hessian、java、protostuff)
- java原生序列化和Kryo序列化性能实例对比分析
- java两种序列化(hessian与java自带)性能实验分析报告
- java原生序列化和Kryo(dubbo)序列化性能比较
- java序列化/反序列化之xstream、protobuf、protostuff 的比较与使用例子
- java序列化与反序列化(3)------jdk原生序列化机制Externalizable
- java序列化与反序列化(4)------jdk原生序列化机制实现深拷贝
- java原生序列化和Kryo序列化性能比较
- Java性能分析工具JDK VisualVM
- java原生序列化和Kryo序列化性能比较