JID是一个用来反序列化、更新和重新序列化Map对象,在i52.53GHz处理器的机器上,完成10000条目的操作仅需4毫秒。序列化和重新序列化的时间很大程度上依赖于表条目的大小和复杂度,增量式的序列化和反序列化用于达到高性能。
今天我试验了下使用JID进行Java对象的序列化过程,现将这个过程与大家分享,至于在何种场景下使用大家自己发挥。
首先JID依赖于JActor和SLF4J,你下载的JID压缩包中就包含这二者的jar文件。
大家先不需要关心代码中牵扯的一些类是作何用途的,先把例子跑起来!
我们这里假设要对一个User对象进行序列化,User对象如下:
05 | public static class User extends AppJid{ |
06 | private StringJidgetNameJid() throws Exception{ |
07 | return (StringJid)_iGet( 0 ); |
10 | private IntegerJidgetAgeJid() throws Exception{ |
11 | return (IntegerJid)_iGet( 1 ); |
14 | public StringgetName() throws Exception{ |
15 | return getNameJid().getValue(); |
18 | public void setName(Stringname) throws Exception{ |
19 | getNameJid().setValue(name); |
22 | public int getAge() throws Exception{ |
23 | return getAgeJid().getValue(); |
26 | public void setAge( int age) throws Exception{ |
27 | getAgeJid().setValue(age); |
然后每个要做序列化的对象都需要有个对应的工厂类,这里是UserFactory:
01 | public static class UserFactory extends AppJidFactory{ |
02 | final public static UserFactoryfac= new UserFactory(); |
05 | super ( "User" ,JidFactories.STRING_JID_TYPE,JidFactories.INTEGER_JID_TYPE); |
08 | protected UserinstantiateActor() throws Exception{ |
其中特别注意UserFactory构造函数里的"User"这个参数,下面需要用到。
接下来就是测试程序:
01 | public static void main(String[]args) throws Exception{ |
03 | JAFactoryfactory= new JAFactory(){{( new JidFactories()).initialize( this );}}; |
04 | factory.registerActorFactory(UserFactory.fac); |
06 | RootJidrootJid=(RootJid)factory.newActor(JidFactories.ROOT_JID_TYPE); |
07 | long ct=System.currentTimeMillis(); |
08 | rootJid.setValue( "User" ); |
10 | Useruser=(User)rootJid.getValue(); |
11 | user.setName( "WinterLau" ); |
14 | int slen=rootJid.getSerializedLength(); |
16 | byte []sdatas= new byte [slen]; |
17 | rootJid.save(sdatas, 0 ); |
19 | rootJid.load(sdatas, 0 ,slen); |
20 | Useruser1=(User)rootJid.getValue(); |
22 | 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理