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

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

创新互联公司服务项目包括沧县网站建设、沧县网站制作、沧县网页制作以及沧县网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,沧县网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到沧县省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

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

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

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

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

 
 
 
  1. /**  
  2.  * 序列化对象  
  3.  * @author Winter Lau  
  4.  */ 
  5. public static class User extends AppJid {  
  6.     private StringJid getNameJid() throws Exception {  
  7.         return (StringJid) _iGet(0);  
  8.     }  
  9.       
  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.     }  

然后每个要做序列化的对象都需要有个对应的工厂类,这里是 UserFactory:

 
 
 
  1. public static class UserFactory extends AppJidFactory {  
  2.     final public static UserFactory fac = new UserFactory();  
  3.  
  4.     public UserFactory() {  
  5.         super("User", JidFactories.STRING_JID_TYPE, JidFactories.INTEGER_JID_TYPE);  
  6.     }  
  7.  
  8.     protected User instantiateActor() throws Exception {  
  9.         return new User();  
  10.     }  

其中特别注意 UserFactory 构造函数里的 "User" 这个参数,下面需要用到。

接下来就是测试程序:

 
 
 
  1. public static void main(String[] args) throws Exception {  
  2.       
  3.     JAFactory factory = new JAFactory(){{(new JidFactories()).initialize(this);}};  
  4.     factory.registerActorFactory(UserFactory.fac);  
  5.       
  6.     RootJid rootJid = (RootJid) factory.newActor(JidFactories.ROOT_JID_TYPE);  
  7.     long ct = System.currentTimeMillis();  
  8.     rootJid.setValue("User");  
  9.       
  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.       

程序讲解:

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

原文链接:http://www.oschina.net/question/12_91132

文章题目:使用JID来进行Java对象的高性能序列化
标题URL:http://www.mswzjz.com/qtweb/news6/183156.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联