溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用JID來(lái)進(jìn)行Java對(duì)象的高性能序列化

發(fā)布時(shí)間:2021-09-18 17:35:59 來(lái)源:億速云 閱讀:158 作者:柒染 欄目:編程語(yǔ)言

如何使用JID來(lái)進(jìn)行Java對(duì)象的高性能序列化,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

JID 是一個(gè)用來(lái)反序列化、更新和重新序列化 Map 對(duì)象,在 i5 2.53GHz  處理器的機(jī)器上,完成 10000 條目的操作僅需 4  毫秒。序列化和重新序列化的時(shí)間很大程度上依賴于表?xiàng)l目的大小和復(fù)雜度,增量式的序列化和反序列化用于達(dá)到高性能。

今天我試驗(yàn)了下使用 JID 進(jìn)行 Java  對(duì)象的序列化過(guò)程,現(xiàn)將這個(gè)過(guò)程與大家分享,至于在何種場(chǎng)景下使用大家自己發(fā)揮。

首先 JID 依賴于 JActor 和 SLF4J ,你下載的 JID 壓縮包中就包含這二者的 jar 文件。

大家先不需要關(guān)心代碼中牽扯的一些類是作何用途的,先把例子跑起來(lái)!

我們這里假設(shè)要對(duì)一個(gè) User 對(duì)象進(jìn)行序列化,User 對(duì)象如下:

/**  * 序列化對(duì)象  * @author Winter Lau  */ 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);     } }

然后每個(gè)要做序列化的對(duì)象都需要有個(gè)對(duì)應(yīng)的工廠類,這里是  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 構(gòu)造函數(shù)里的 "User" 這個(gè)參數(shù),下面需要用到。

接下來(lái)就是測(cè)試程序:

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. 首先需要構(gòu)造 JAFactory ,這是使用 JID 必須的一步(第3行)

2. 然后注冊(cè)我們需要進(jìn)行序列化的類(第4行)

3. 構(gòu)造  RootJid,這也是必須的一步(第6行)

4. rootJid.setValue("User")  這是設(shè)置要進(jìn)行序列化的對(duì)象類型,這個(gè) "User" 就是我們?cè)?UserFactory 定義的字符串

5. 對(duì)  User 對(duì)象實(shí)例進(jìn)行值設(shè)置

6. 使用 rootJid.save 方法進(jìn)行序列化,就是把對(duì)象轉(zhuǎn)稱 byte  數(shù)組

7. ***一步是演示從 byte 數(shù)據(jù)中加載對(duì)象并打印對(duì)象的屬性

這便是一個(gè)完整的使用 JID 進(jìn)行自定義對(duì)象的序列化和反序列化的過(guò)程。如果你是使用 Java  原生的一些數(shù)據(jù)類型,就不需要自行創(chuàng)建類對(duì)象。

這里需要很注意的是 UserFactory  中構(gòu)造函數(shù)的參數(shù)順序,***個(gè)參數(shù)是類型名稱,接下來(lái)的每個(gè)參數(shù)是對(duì)應(yīng)每個(gè)屬性的類型,這個(gè)必須嚴(yán)格對(duì)應(yīng) User 類中的 _iGet(xx) 中 xx  的值。

據(jù)說(shuō) JID 的序列化的性能是極高的,這方面我還沒(méi)進(jìn)行測(cè)試。需要注意的是這個(gè)序列化的結(jié)果和 Java  本身的序列化是不兼容的。

完整的代碼以及列表的序列化請(qǐng)看:

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

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI