文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-17 09:24

关注

如何使用JID来进行Java对象的高性能序列化,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

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

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

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

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

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

 public static class User extends AppJid {     private StringJid getNameJid() throws Exception {         return (StringJid) _iGet(0);     }          private IntegerJid getAgeJid() throws Exception {         return (IntegerJid) _iGet(1);     }          public String getName() throws Exception {         return getNameJid().getValue();     }          public void setName(String name) throws Exception {         getNameJid().setValue(name);     }          public int getAge() throws Exception {         return getAgeJid().getValue();     }          public void setAge(int age) throws Exception {         getAgeJid().setValue(age);     } }

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

public static class UserFactory extends AppJidFactory {     final public static UserFactory fac = new UserFactory();      public UserFactory() {         super("User", JidFactories.STRING_JID_TYPE, JidFactories.INTEGER_JID_TYPE);     }      protected User instantiateActor() throws Exception {         return new User();     } }

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

接下来就是测试程序:

public static void main(String[] args) throws Exception {          JAFactory factory = new JAFactory(){{(new JidFactories()).initialize(this);}};     factory.registerActorFactory(UserFactory.fac);          RootJid rootJid = (RootJid) factory.newActor(JidFactories.ROOT_JID_TYPE);     long ct = System.currentTimeMillis();     rootJid.setValue("User");          User user = (User)rootJid.getValue();     user.setName("Winter Lau");     user.setAge(98);          int slen = rootJid.getSerializedLength();          byte[] sdatas = new byte[slen];     rootJid.save(sdatas, 0);          rootJid.load(sdatas, 0, slen);     User user1 = (User)rootJid.getValue();          System.out.printf("%dms->%s:%d\n", (System.currentTimeMillis()-ct), user1.getName(), user1.getAge());      }

程序讲解:

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

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯