`
aijuans
  • 浏览: 1544040 次
社区版块
存档分类
最新评论

使用 JID 来进行 Java 对象的高性能序列化

 
阅读更多

JID 是一个用来反序列化、更新和重新序列化 Map 对象,在 i5 2.53GHz 处理器的机器上,完成 10000 条目的操作仅需 4 毫秒。序列化和重新序列化的时间很大程度上依赖于表条目的大小和复杂度,增量式的序列化和反序列化用于达到高性能。

今天我试验了下使用 JID 进行 Java 对象的序列化过程,现将这个过程与大家分享,至于在何种场景下使用大家自己发挥。

首先 JID 依赖于 JActorSLF4J ,你下载的 JID 压缩包中就包含这二者的 jar 文件。

大家先不需要关心代码中牵扯的一些类是作何用途的,先把例子跑起来!

我们这里假设要对一个 User 对象进行序列化,User 对象如下:

01 /**
02  * 序列化对象
03  * @author Winter Lau
04  */
05 public static class User extends AppJid {
06     private StringJid getNameJid() throws Exception {
07         return (StringJid) _iGet(0);
08     }
09      
10     private IntegerJid getAgeJid() throws Exception {
11         return (IntegerJid) _iGet(1);
12     }
13      
14     public String getName() throws Exception {
15         return getNameJid().getValue();
16     }
17      
18     public void setName(String name) throws Exception {
19         getNameJid().setValue(name);
20     }
21      
22     public int getAge() throws Exception {
23         return getAgeJid().getValue();
24     }
25      
26     public void setAge(int age) throws Exception {
27         getAgeJid().setValue(age);
28     }
29 }
然后每个要做序列化的对象都需要有个对应的工厂类,这里是 UserFactory:
01 public static class UserFactory extends AppJidFactory {
02     final public static UserFactory fac = new UserFactory();
03  
04     public UserFactory() {
05         super("User", JidFactories.STRING_JID_TYPE, JidFactories.INTEGER_JID_TYPE);
06     }
07  
08     protected User instantiateActor() throws Exception {
09         return new User();
10     }
11 }
其中特别注意 UserFactory 构造函数里的 "User" 这个参数,下面需要用到。

接下来就是测试程序:

01 public static void main(String[] args) throws Exception {
02      
03     JAFactory factory = new JAFactory(){{(new JidFactories()).initialize(this);}};
04     factory.registerActorFactory(UserFactory.fac);
05      
06     RootJid rootJid = (RootJid) factory.newActor(JidFactories.ROOT_JID_TYPE);
07     long ct = System.currentTimeMillis();
08     rootJid.setValue("User");
09      
10     User user = (User)rootJid.getValue();
11     user.setName("Winter Lau");
12     user.setAge(98);
13      
14     int slen = rootJid.getSerializedLength();
15      
16     byte[] sdatas = new byte[slen];
17     rootJid.save(sdatas, 0);
18      
19     rootJid.load(sdatas, 0, slen);
20     User user1 = (User)rootJid.getValue();
21      
22     System.out.printf("%dms->%s:%d\n", (System.currentTimeMillis()-ct), user1.getName(), user1.getAge());
23      
24 }

程序讲解:

1. 首先需要构造 JAFactory ,这是使用 JID 必须的一步(第3行)
2. 然后注册我们需要进行序列化的类(第4行)
3. 构造 RootJid,这也是必须的一步(第6行)
4. rootJid.setValue("User") 这是设置要进行序列化的对象类型,这个 "User" 就是我们在 UserFactory 定义的字符串
5. 对 User 对象实例进行值设置
6. 使用 rootJid.save 方法进行序列化,就是把对象转称 byte 数组
7. 最后一步是演示从 byte 数据中加载对象并打印对象的属性

这便是一个完整的使用 JID 进行自定义对象的序列化和反序列化的过程。如果你是使用 Java 原生的一些数据类型,就不需要自行创建类对象。

这里需要很注意的是 UserFactory 中构造函数的参数顺序,第一个参数是类型名称,接下来的每个参数是对应每个属性的类型,这个必须严格对应 User 类中的 _iGet(xx) 中 xx 的值。

据说 JID 的序列化的性能是极高的,这方面我还没进行测试。需要注意的是这个序列化的结果和 Java 本身的序列化是不兼容的。

完整的代码以及列表的序列化请看:

https://github.com/oschina/cache-framework/tree/master/src/net/oschina/demo

分享到:
评论

相关推荐

    java解析mp3工具-jid3lib

    MP3 ID3解析库。支持 ID3v1, ID3v1.1, Lyrics3v1, Lyrics3v2, ID3v2.2, ID3v2.3, ID3v2.4。源码下载:http://javamusictag.sourceforge.net/ ,发现对支持utf-16编码是有些问题的。期望这个jar包对大家有所帮助。

    Java学习路线jid

    Java学习路线

    Java递归算法jid

    Java递归算法

    org.xmpp.packet.JID

    在使用android openfire 作为IM服务的时候 利用第三方账号 如果第三方账号中含有@符号的话 登录会报错 可以利用这个代码进行...然后传递到openfire 在查询数据库之前进行解析 这是在openfire的源代码中找出来 [更多]

    antlr-java-parser-1.0.5.zip

    JID.zip,增量反序列化jactor的增量反序列化

    jid3lib-0.5.4.jar

    jid3lib-0.5.4.jar,编译nutch0.9,有两个plugin编译不能通过,mp3,rtf插件编译,找不到jar,这是其中一个

    JID:JavaScript的XMPP标识符(JID)

    JID JavaScript的XMPP标识符(JID) 爱丽丝@ wonderland.net / Rabbithole <本地> @ <域> / <资源>用法var jid = new JID ( 'alice' , 'wonderland.net' , 'rabbithole' )var jid = new JID ( 'alice@...

    JID - Java Image Downloader-开源

    用于图像托管服务的Java批量图像下载器。 还用作bin2img转换器中的插件:将任何文件转换为PNG并从图像托管网站上载/从图像主机上载/下载:https://sourceforge.net/p/binfile2imgconv/

    jid:json增量挖掘器

    您可以使用诸如类的过滤查询来交互式地向下钻取JSON。 建议和自动完成此工具将为您提供非常舒适的JSON向下钻取。 演示版 安装 带自制程序(对于Mac) brew install jid 使用pkg(对于FreeBSD) pkg install jid ...

    jid3lib-0.5.1.jar

    在eclipse中加载nutch会出现问题,其中就是缺了2个包,提供的就是nutch中的MP3包,

    超市管理系统小型的(java)

    武汉星星超市管理系统(2007-10-2007-12) 项目描述:对超市的货物、员工、财务进行管理 职责:模块开发,系统设计,数据... bj.58.com/tech/35220795x.shtml 11K 2009-2-13 - 百度快照 源码下载列表 - 纽纶网 | ...

    Go-Jid–json增量挖掘机

    Jid – json增量挖掘机

    jaudiotagger,jid3lib,jl_core_z

    jaudiotagger-2.0.4.jar 用于获取MP3,wav等格式音频文件的播放时间长度

    JActor:高性能,无锁Java Actor-开源

    JActor是旨在简化垂直可伸缩性的高性能actor框架。 JActor几乎总是通过同步执行来实现其速度,尽管它很容易在需要时强制进行异步处理。 JActor分为几个GitHub项目:JActor-...

    node-jid:解析和处理 XMPPJabber 标识符

    JID 解析和处理 /Jabber 标识符。 用法 var JID = require ( "jid" ) ; var myJID = new JID ( "foo@bar.baz.tld/bla" ) ; myJID . local // "foo" myJID . domain // "bar.baz.tld" myJID . resource // "bla" ...

    examples-java-filebrowser

    并且,它提供了仅使用JavaFX即可可视化当前文件的标签数据的功能。 入门(面向开发人员) Java 安装Java SDK,Java IDE,Import Swing,JavaFX $ install 'jid3lib.jar, jaudiotagger.jar' on Java IDE. and run ...

    rtf-parse.jar、jid3lib-0.5.4.jar

    rtf-parse.jar、jid3lib-0.5.4.jar,nutch编译需要的jar文件

    jid3lib-0.5.4与rtf-parser nutch

    Nutch 实战:http://www.ibm.com/developerworks/cn/opensource/os-cn-nutchintro/ Nutch还需要另外两个jar文件,jid3lib-0.5.1.jar和rtf-parser.jar

    阿里修改java源码-WhatsAPI:什么是应用程序API

    阿里修改java源码有关最近的更改,请参阅 什么是API WhatsApp Messenger 的界面 什么是WhatsApp? 根据 : “WhatsApp Messenger 是一个跨平台的移动通讯工具,它取代了 SMS 并通过您设备的现有互联网数据计划工作。...

    jiq:jid上的jid-使用jq表达式的交互式JSON查询工具

    演示版安装(并确保首先使用chmod +x )或使用Go安装/编译: go get github.com/fiatjaf/jiq/cmd/jiq如果尚未安装jq ,请按照说明进行操作,并确保将其放入PATH 。用法快速开始简单的例子执行以下命令: echo '{"aa...

Global site tag (gtag.js) - Google Analytics