序列化 — FST序列化


FST序列化全稱是Fast Serialization,它是對Java序列化的替換實現。既然前文中提到Java序列化的兩點嚴重不足,在FST中得到了較大的改善,FST的特征如下:

  1. 比JDK提供的序列化提升了10倍,體積也減少3-4倍多
  2. 支持堆外Maps,和堆外Maps的持久化
  3. 支持序列化為JSON

一.FST序列化的使用

FST的使用有兩種方式,一種是快捷方式,另一種需要使用ObjectOutput和ObjectInput。

static void quickStart() {
    FSTConfiguration conf = FSTConfiguration.createAndroidDefaultConfiguration();
    FstObject object = new FstObject();
    object.setName("huaijin");
    object.setAge(30);
    System.out.println("serialization, " + object);
    
    byte[] bytes = conf.asByteArray(object);
    
    FstObject newObject = (FstObject) conf.asObject(bytes);
    
    System.out.println("deSerialization, " + newObject);
}

直接使用FSTConfiguration提供的序列化和反序列化接口。FSTConfiguration也提供了注冊對象的Class接口,如果不注冊,默認會將對象的Class Name寫入。

這個提供了易用高效的API方式,不使用ByteArrayOutputStreams而直接得到byte[]。

另一種方式是使用ObjectOutput和ObjectInput,能更細膩控制序列化的寫入寫出:

static FSTConfiguration conf = FSTConfiguration.createAndroidDefaultConfiguration();

static void writeObject(OutputStream outputStream, FstObject fstObject) throws IOException {
    FSTObjectOutput out = conf.getObjectOutput(outputStream);
    out.writeObject(fstObject);
    out.close();
}

static FstObject readObject(InputStream inputStream) throws Exception {
    FSTObjectInput input = conf.getObjectInput(inputStream);
    FstObject fstObject = (FstObject) input.readObject(FstObject.class);
    input.close();
    return fstObject;
}

二.FST在Dubbo中的應用

Dubbo中對FstObjectInput和FstObjectOutput重新包裝解決了序列化和反序列化空指針的問題。

並且構造了FstFactory工廠類,使用工廠模式生成FstObjectInput和FstObjectOutput。其中同時使用單例模式,控制整個應用中FstConfiguration是單例,並且在初始化時將需要序列化的對象全部注冊到FstConfiguration。

對外提供了同一的序列化接口FstSerialization,提供serialize和deserialize能力。


參考

fast-serialization


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM