成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java常用序列化與反序列化方法

zhkai / 2181人閱讀

摘要:序列化工具類序列化工具的序列化與反序列化使用實(shí)現(xiàn)序列化和反序列化反序列化時(shí),必須要有默認(rèn)構(gòu)造函數(shù),否則報(bào)錯(cuò)使用序列化緩存此類分別包含序列化序列化序列化三種序列化方式。

序列化工具類

序列化即將對象序列化為字節(jié)數(shù)組,反序列化就是將字節(jié)數(shù)組恢復(fù)成對象。
主要的目的是方便傳輸和存儲(chǔ)。

序列化工具類:

public class SerializeUtil {

    private static Map, Schema> cachedSchema = new ConcurrentHashMap<>();

    private static Objenesis objenesis = new ObjenesisStd(true);

    /**
     * jdk 序列化工具的序列化與反序列化
     *
     * @param object
     * @return
     * @throws IOException
     */
    public static byte[] JDKObjectToBytes(Object object) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutput objectOutput = new ObjectOutputStream(byteArrayOutputStream);
        objectOutput.writeObject(object);
        return byteArrayOutputStream.toByteArray();
    }

    public static  T JDKBytesToObject(byte[] bytes, Class clazz) throws Exception {
        ObjectInputStream objectInputStream = new ObjectInputStream(new ByteArrayInputStream(bytes));
        Object object = objectInputStream.readObject();
        return (T) object;
    }

    /**
     * 使用fastjson實(shí)現(xiàn)序列化和反序列化
     *
     * @param object
     * @return
     */
    public static byte[] FastJsonObjectToBytes(Object object) {
        byte[] bytes = JSON.toJSONBytes(object);
        return bytes;
    }

    /**
     * fastjosn反序列化時(shí),class必須要有默認(rèn)構(gòu)造函數(shù),否則報(bào)錯(cuò)
     * @param bytes
     * @param clazz
     * @param 
     * @return
     */
    public static  T FastJsonBytesToObject(byte[] bytes, Class clazz) {
        return (T) JSON.parseObject(bytes, clazz);
    }

    /**
     * 使用protostuff序列化
     * @param obj
     * @param 
     * @return
     */
    public static  byte[] serialize(T obj) {
        Class cls = (Class) obj.getClass();
        LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
        try {
            Schema schema = getSchema(cls);
            return ProtostuffIOUtil.toByteArray(obj, schema, buffer);
        } catch (Exception e) {
            throw new IllegalStateException(e.getMessage(), e);
        } finally {
            buffer.clear();
        }
    }

    public static  T deserialize(byte[] data, Class cls) {
        try {
            T message = objenesis.newInstance(cls);
            Schema schema = getSchema(cls);
            ProtostuffIOUtil.mergeFrom(data, message, schema);
            return message;
        } catch (Exception e) {
            throw new IllegalStateException(e.getMessage(), e);
        }
    }

    /**
     * 緩存schema
     * @param cls
     * @param 
     * @return
     */
    private static  Schema getSchema(Class cls) {
        Schema schema = (Schema) cachedSchema.get(cls);
        if (schema == null) {
            schema = RuntimeSchema.createFrom(cls);
            if (schema != null) {
                cachedSchema.put(cls, schema);
            }
        }
        return schema;
    }
}

此類分別包含jdk序列化、fastjson序列化、protobuf序列化三種序列化方式。

注意prostuff需要包含maven依賴:

        
        
            org.objenesis
            objenesis
            2.6
        

        
            io.protostuff
            protostuff-core
            1.4.0
        

        
            io.protostuff
            protostuff-runtime
            1.4.0
        
        
        
        
            com.alibaba
            fastjson
            1.2.31
        
使用

首先定義一個(gè)類用于測試,注意此類沒有默認(rèn)構(gòu)造函數(shù)。

public class Monster implements Serializable{
    Integer hp;
    Integer mp;
    String name;
    Integer level;

    public Monster(String name,Integer level){
        this.name=name;
        this.level=level;
    }
    
    //省略getter、setter、hashCode、equals...
}

測試類:

public class SerializeUtilTest {

    Monster monster = new Monster("boss", 100);
    Class clazz = Monster.class;

    @Test
    public void jdkSerializeTest() throws Exception {
        byte[] bytes = SerializeUtil.JDKObjectToBytes(monster);
        System.out.println(bytes.length);
        Monster object = SerializeUtil.JDKBytesToObject(bytes,clazz);
        Assert.assertEquals(object, monster);
    }

    @Test(expected = com.alibaba.fastjson.JSONException.class)
    public void fastJsonSerializeTest(){
        byte[] bytes = SerializeUtil.FastJsonObjectToBytes(monster);
        System.out.println(bytes.length);
        Monster object = SerializeUtil.FastJsonBytesToObject(bytes,clazz);
        Assert.assertEquals(object, monster);
    }

    @Test
    public void serialize(){
        byte[] serialize = SerializeUtil.serialize(monster);
        System.out.println(serialize.length);
        Object deserialize = SerializeUtil.deserialize(serialize, clazz);
        Assert.assertEquals(deserialize,monster);
    }
}

輸出分別為199、27、8。
可以看出jdk默認(rèn)序列化方式的效率極低,protobuf效率和字節(jié)都非常高效。

特別注意:fastjson反序列化的對象必須要有默認(rèn)構(gòu)造函數(shù),否則會(huì)報(bào)錯(cuò)。protostuff使用objenesis不需要默認(rèn)構(gòu)函數(shù)創(chuàng)建對象。但是json格式可讀性好,性能也還可以,推薦性能不高的場景優(yōu)先json格式,對性能要求高的場景使用protostuff。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67490.html

相關(guān)文章

  • Java開發(fā)中對象的列化與反列化

    摘要:在中,對象的序列化與反序列化被廣泛應(yīng)用到遠(yuǎn)程方法調(diào)用及網(wǎng)絡(luò)傳輸中。相關(guān)接口及類為了方便開發(fā)人員將對象進(jìn)行序列化及反序列化提供了一套方便的來支持。未實(shí)現(xiàn)此接口的類將無法使其任何狀態(tài)序列化或反序列化。 序列化與反序列化 序列化 (Serialization)是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^程。一般將一個(gè)對象存儲(chǔ)至一個(gè)儲(chǔ)存媒介,例如檔案或是記億體緩沖等。在網(wǎng)絡(luò)傳輸過程中,可以...

    fox_soyoung 評(píng)論0 收藏0
  • Javag工程師成神之路(2019正式版)

    摘要:結(jié)構(gòu)型模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。行為型模式模版方法模式命令模式迭代器模式觀察者模式中介者模式備忘錄模式解釋器模式模式狀態(tài)模式策略模式職責(zé)鏈模式責(zé)任鏈模式訪問者模式。 主要版本 更新時(shí)間 備注 v1.0 2015-08-01 首次發(fā)布 v1.1 2018-03-12 增加新技術(shù)知識(shí)、完善知識(shí)體系 v2.0 2019-02-19 結(jié)構(gòu)...

    Olivia 評(píng)論0 收藏0
  • 你和阿里資深架構(gòu)師之間,差的不僅僅是年齡(進(jìn)階必看)

    摘要:導(dǎo)讀閱讀本文需要有足夠的時(shí)間,筆者會(huì)由淺到深帶你一步一步了解一個(gè)資深架構(gòu)師所要掌握的各類知識(shí)點(diǎn),你也可以按照文章中所列的知識(shí)體系對比自身,對自己進(jìn)行查漏補(bǔ)缺,覺得本文對你有幫助的話,可以點(diǎn)贊關(guān)注一下。目錄一基礎(chǔ)篇二進(jìn)階篇三高級(jí)篇四架構(gòu)篇五擴(kuò) 導(dǎo)讀:閱讀本文需要有足夠的時(shí)間,筆者會(huì)由淺到深帶你一步一步了解一個(gè)資深架構(gòu)師所要掌握的各類知識(shí)點(diǎn),你也可以按照文章中所列的知識(shí)體系對比自身,對自己...

    huaixiaoz 評(píng)論0 收藏0
  • JAVA運(yùn)行時(shí)的泛型擦除與反列化的應(yīng)用

    摘要:回到的第二方法的用法,通過上面的分析,我們可以知道,方法其實(shí)也是用來獲取泛型的實(shí)際類型的,這樣就可以將響應(yīng)反序列化為帶泛型的類型了。在很多反序列化的開源組件中,都用了這個(gè)原理例如的方法,所以我們會(huì)經(jīng)常見到實(shí)例化的時(shí)候會(huì)多個(gè)花括號(hào)。 前段日子在使用google-http-client.jar 這個(gè)組件做http請求時(shí),發(fā)現(xiàn)一件有趣的事情,具體代碼如下: try { ...

    weizx 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<