高性能序列化框架FST

标签: 性能 序列化 框架 | 发表时间:2014-10-13 17:53 | 作者:247687009
出处:http://www.iteye.com
fst是完全兼容JDK序列化协议的系列化框架,序列化速度大概是JDK的4-10倍,大小是JDK大小的1/3左右。
首先引入pom

<dependency>
  <groupId>de.ruedigermoeller</groupId>
  <artifactId>fst</artifactId>
  <version>2.04</version>
</dependency>
 测试代码
package zookeeper.seria;

import java.io.Serializable;

public class FSTSeriazle {

	public static void main(String[] args) {
		User bean = new User();
		bean.setUsername("xxxxx");
		bean.setPassword("123456");
		bean.setAge(1000000);
		System.out.println("序列化 , 反序列化 对比测试:");
		long size = 0;
		long time1 = System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
			byte[] jdkserialize = JRedisSerializationUtils.jdkserialize(bean);
			size += jdkserialize.length;
			JRedisSerializationUtils.jdkdeserialize(jdkserialize);
		}
		System.out.println("原生序列化方案[序列化10000次]耗时:"
				+ (System.currentTimeMillis() - time1) + "ms size:=" + size);

		size = 0;
		long time2 = System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
			byte[] serialize = JRedisSerializationUtils.serialize(bean);
			size += serialize.length;
			User u = (User) JRedisSerializationUtils.unserialize(serialize);
		}
		System.out.println("fst序列化方案[序列化10000次]耗时:"
				+ (System.currentTimeMillis() - time2) + "ms size:=" + size);
		size = 0;
		long time3 = System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
			byte[] serialize = JRedisSerializationUtils.kryoSerizlize(bean);
			size += serialize.length;
			User u = (User) JRedisSerializationUtils.kryoUnSerizlize(serialize);
		}
		System.out.println("kryo序列化方案[序列化10000次]耗时:"
				+ (System.currentTimeMillis() - time3) + "ms size:=" + size);

	}

}

class User implements Serializable{

	private String username;
	private int age;
	private String password;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}
 结果
序列化 , 反序列化 对比测试:
原生序列化方案[序列化10000次]耗时:458ms size:=1160000
fst序列化方案[序列化10000次]耗时:184ms size:=550000
kryo序列化方案[序列化10000次]耗时:462ms size:=390000
 工具类
package zookeeper.seria;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import org.nustaq.serialization.FSTConfiguration;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;

public class JRedisSerializationUtils {

	public JRedisSerializationUtils() {
	}

	static FSTConfiguration configuration = FSTConfiguration
	// .createDefaultConfiguration();
			.createStructConfiguration();

	public static byte[] serialize(Object obj) {
		return configuration.asByteArray(obj);
	}

	public static Object unserialize(byte[] sec) {
		return configuration.asObject(sec);
	}

	public static byte[] kryoSerizlize(Object obj) {
		Kryo kryo = new Kryo();
		byte[] buffer = new byte[2048];
		try(
				Output output = new Output(buffer);
				) {
			
			kryo.writeClassAndObject(output, obj);
			return output.toBytes();
		} catch (Exception e) {
		}
		return buffer;
	}

	static Kryo kryo = new Kryo();
	public static Object kryoUnSerizlize(byte[] src) {
		try(
		Input input = new Input(src);
				){
			return kryo.readClassAndObject(input);
		}catch (Exception e) {
		}
		return kryo;
	}

	// jdk原生序列换方案
	public static byte[] jdkserialize(Object obj) {
		try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
				ObjectOutputStream oos = new ObjectOutputStream(baos);) {
			oos.writeObject(obj);
			return baos.toByteArray();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	public static Object jdkdeserialize(byte[] bits) {
		try (ByteArrayInputStream bais = new ByteArrayInputStream(bits);
				ObjectInputStream ois = new ObjectInputStream(bais);

		) {
			return ois.readObject();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}
 


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [性能 序列化 框架] 推荐:

高性能序列化框架FST

- - 开源软件 - ITeye博客
fst是完全兼容JDK序列化协议的系列化框架,序列化速度大概是JDK的4-10倍,大小是JDK大小的1/3左右. System.out.println("序列化 , 反序列化 对比测试:");. System.out.println("原生序列化方案[序列化10000次]耗时:". System.out.println("fst序列化方案[序列化10000次]耗时:".

大数据框架hadoop的序列化机制

- - ITeye博客
       对象的序列化(Serialization)用于将对象编码成一个字节流,以及从字节流中重新构建对象. “将一个对象编码成一个字节流”称为序列化该对象(Serializing);相反的处理过程称为反序列化(Deserializing). 1.1              Java内建序列化机制.

序列化框架比较:kryo & hessian & Protostuff & java

- - zzm
序列化框架性能对比(kryo、hessian、java、protostuff). 无需静态编译,但序列化前需预先传入schema. 不支持无默认构造函数的类,反序列化时需用户自己初始化序列化后的对象,其只负责将该对象进行赋值. 测试方法:(参考自 https://github.com/eishay/jvm-serializers).

rrestjs高性能restful框架

- - CNode社区
rrestjs(ROA-Restful js)是在expressjs代码的基础上开发的(这样可以减少很多bug,同时要感谢expressjs作者visionmedia无私的奉献),不过整个框架结构已经完全改变了,属性以及方法定义也是全新的,可以说是一个全新的node.js框架. 先献上一个简单的hello world 的例子吧:.

Java RESTful框架的性能比较

- - 鸟窝
在微服务流行的今天,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单元实现为微服务,可以将它们发布到一些分布式计算单元或者Docker中,并在性能需要的时候及时地创建更多的服务单元. 微服务是一个概念,并没有规定服务的格式,但是很多厂商和框架都不约而同的采用RESTful的架构,尽管也有一些其它的性能很好的RPC框架.

七种WebSocket框架的性能比较

- - 鸟窝
前一篇文章 使用四种框架分别实现百万websocket常连接的服务器介绍了四种websocket框架的测试方法和基本数据. 最近我又使用几个框架实现了websocket push服务器的原型,并专门对这七种实现做了测试. 本文记录了测试结果和一些对结果的分析. 使用三台C3.4xlarge AWS服务器做测试.

2016年Web框架性能基准

- - 鸟窝
TechEmpower最近发布了他们的第13轮的web框架的性能测试,得到了一些有价值的测试结果. 由于年初前一轮的测试遭遇到了硬件的瓶颈,微软 Azure 和 ServerCentral 分别提供了云主机和物理主机环境,所以第13轮的测试是在新的测试环境中进行的,所以你把这轮的测试结果和以前的测试进行比较的话可能不太合适.

(反)序列化

- - Java - 编程语言 - ITeye博客
本章关注对象序列化API,它提供了一个框架,用来将对象编码成字节流,并从字节流中重新构建对象. “将对象编码成字节流”被称作对象序列化,相反的处理过程被称作反序列化. 序列化技术为远程通信提供了标准的线路级对象表示法,也为JavaBeans组件结构提供了标准的持久化数据格式. 第七十四条:谨慎地实现Serializable接口.

java序列化java.io.Externalizable

- - Java - 编程语言 - ITeye博客
这次我们讲的是控制对象的序列化和反序列化. 控制序列化就是有选择的序列化对象,而不是把对象的所以内容都序列化,前篇我们的例子中介绍了transit变量和类变量(static)不被序列化,现在我们还有一种更为灵活的控制对象序列化和反序列方法,可以在序列化过程中储存其他非this对象包含的数据. 我们现在再来介绍一个接口 java.io.Externalizable.

webmagic 0.3.0 发布,高性能Java爬虫框架

- - 开源中国社区最新新闻
webmagic的是一个无须配置、便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫. 之前两个版本的主题分别是"灵活","方便",而此次更新的主题是"性能". 重写了XPath解析器,替换了HtmlCleaner. 这个XPath解析器(我另外建立了一个项目 Xsoup)基于Jsoup完成,比HtmlCleaner性能好一倍以上,同时有更友好的错误提示.