您好,登錄后才能下訂單哦!
如何使用JID來進行Java對象的高性能序列化,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
JID 是一個用來反序列化、更新和重新序列化 Map 對象,在 i5 2.53GHz 處理器的機器上,完成 10000 條目的操作僅需 4 毫秒。序列化和重新序列化的時間很大程度上依賴于表條目的大小和復雜度,增量式的序列化和反序列化用于達到高性能。
今天我試驗了下使用 JID 進行 Java 對象的序列化過程,現將這個過程與大家分享,至于在何種場景下使用大家自己發揮。
首先 JID 依賴于 JActor 和 SLF4J ,你下載的 JID 壓縮包中就包含這二者的 jar 文件。
大家先不需要關心代碼中牽扯的一些類是作何用途的,先把例子跑起來!
我們這里假設要對一個 User 對象進行序列化,User 對象如下:
/** * 序列化對象 * @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); } }
然后每個要做序列化的對象都需要有個對應的工廠類,這里是 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
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。