1. 程式人生 > >Kryo序列化與反序列化列子

Kryo序列化與反序列化列子

這是一個Kryo將複雜Bean物件序列化與反序列化,通過字串傳遞的列子。
具體的bean物件此處沒有附加程式碼,可以自己寫一個bean的例子,裡面可包含任何物件,集合,基本型別。但要求有geter和setter方法。
本人在本地測試類以下,除了Map需要Setter方法外,其他屬性沒有setter方法也可序列化與反序列化。

這個例子中使用到了 Class BeanSerializer, 以下是這個類的介紹:
Serializes Java beans using bean accessor methods. Only bean properties with both a getter and setter are serialized

. This class is not as fast as FieldSerializer but is much faster and more efficient than Java serialization. Bytecode generation is used to invoke the bean propert methods, if possible.

BeanSerializer does not write header data, only the object data is stored. If the type of a bean property is not final (note primitives are final) then an extra byte is written for that property.

TaskResult的類:
這裡寫圖片描述
TaskItemResult類:
這裡寫圖片描述

這裡寫圖片描述

package bhz.test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache
.commons.codec.binary.Base64; import bhz.test.task.ExecItemResultIPMI; import bhz.test.task.IExecItemResult; import bhz.test.task.ITaskResult; import bhz.test.task.TaskItemResult; import bhz.test.task.TaskResult; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; import com.esotericsoftware.kryo.serializers.BeanSerializer; import com.esotericsoftware.kryo.serializers.JavaSerializer; import com.esotericsoftware.kryo.serializers.MapSerializer; import com.po.Animal; import com.po.Dog; import com.veraxsystems.vxipmi.coding.commands.ResponseData; import com.veraxsystems.vxipmi.coding.commands.sdr.GetSdrResponseData; public class KyroSerializableOne { public static void main(String[] args) throws IOException { /* long start = System.currentTimeMillis(); Map<String, Integer> map = new HashMap<String, Integer>(); map.put("zhang0", 2); map.put("zhang1", 3); Simple simple = new Simple("zhang" + 2, 2, map); //System.out.println(simple.getAge() + " " + simple.getName() + " " // + simple.getMap().toString()); ExecItemResultIPMI ipmiResult = new ExecItemResultIPMI(); Dog dog = (Dog)simple.getDog(); dog.getExecItemResult().add(ipmiResult); System.out.println("Kryo 序列化時間:" + (System.currentTimeMillis() - start) + " ms"); start = System.currentTimeMillis(); Dog dogSerial = (Dog)simple.getDog(); IExecItemResult iExecItemResult = dogSerial.getExecItemResult().get(0); ExecItemResultIPMI ipmiResultSerial = (ExecItemResultIPMI)iExecItemResult; GetSdrResponseData getSdrResponseData = (GetSdrResponseData)ipmiResultSerial.getResponseData(); //序列化 String data= setSerializableObject(simple,Simple.class); //反序列化 Simple simple1 = (Simple)getSerializableObject(Simple.class,data); System.out.println(simple1.getAge() + " " + simple1.getName() + " " + simple1.getMap().toString()+" "+simple1.getDog().getName()+" ipmiResultSerial :"+ipmiResultSerial.getResponseData()+ " getSdrResponseData:" +new String(getSdrResponseData.getSensorRecordData())); System.out.println("Kryo 反序列化時間:" + (System.currentTimeMillis() - start) + " ms"); */ /*GetSdrResponseData getSdrResponseData = new GetSdrResponseData(); getSdrResponseData.setNextRecordId(111); getSdrResponseData.setSensorRecordData("getSdrResponseData".getBytes()); ResponseData responseData = getSdrResponseData; */ TaskResult taskResult = new TaskResult(); Map<Integer, TaskItemResult> taskItemResult = taskResult.getTaskItemResult(); TaskItemResult itemResult = new TaskItemResult(); List<IExecItemResult> execItemResult = itemResult.getExecItemResult(); ExecItemResultIPMI ipmiResult = new ExecItemResultIPMI(); execItemResult.add(ipmiResult); taskItemResult.put(111, itemResult); System.out.println(taskResult); //ITaskResult result = taskResult; //System.out.println(result.getTaskItemResult()); String setSerializableObject = setSerializableObject(taskResult,TaskResult.class); TaskResult resultObject = (TaskResult)getSerializableObject(TaskResult.class, setSerializableObject); Map<Integer, TaskItemResult> taskItemResult2 = resultObject.getTaskItemResult(); System.out.println(taskItemResult2); } public static <T> String setSerializableObject(Object object,Class<T> clazz ) throws FileNotFoundException { Kryo kryo = new Kryo(); /*MapSerializer serializer = new MapSerializer(); serializer.setKeyClass(Integer.class, new JavaSerializer()); serializer.setKeysCanBeNull(false); serializer.setValueClass(TaskItemResult.class, new BeanSerializer(kryo, TaskItemResult.class)); serializer.setValuesCanBeNull(true); kryo.register(HashMap.class, serializer);*/ kryo.register(clazz, new BeanSerializer(kryo, clazz)); ByteArrayOutputStream baos = new ByteArrayOutputStream(); Output output = new Output(baos); kryo.writeObject(output, object); output.flush(); output.close(); byte[] bys = baos.toByteArray(); try { baos.flush(); baos.close(); } catch (IOException e) { e.printStackTrace(); } String string = new String(new Base64().encode(bys)); //getSerializableObject(string); System.out.println(string); return string; } public static <T> Object getSerializableObject(Class<T> clazz, String data) { Kryo kryo = new Kryo(); /* MapSerializer serializer = new MapSerializer(); serializer.setKeyClass(Integer.class, new JavaSerializer()); serializer.setKeysCanBeNull(false); serializer.setValueClass(TaskItemResult.class, new BeanSerializer(kryo, TaskItemResult.class)); serializer.setValuesCanBeNull(true); kryo.register(HashMap.class, serializer);*/ kryo.register(clazz, new BeanSerializer(kryo, clazz)); ByteArrayInputStream bais = new ByteArrayInputStream(new Base64().decode(data.getBytes())); Input input; Object simple = null; try { input = new Input(bais); input.close(); simple = kryo.readObject(input, clazz); // if((simple=kryo.readObject(input, Simple.class)) != null){ //System.out.println(simple.getAge() + " " + simple.getName() + " " // + simple.getMap().toString()+" "+simple.getDog().getName()); // } } catch (Exception e) { e.printStackTrace(); } return simple; } }

更新:

以下是經過整理和執行驗證過的方法:
將需要序列化的Bean物件 ArrayList、 HashMap 放入方法中序列化,然後在反序列化,強轉成自己想要的型別即可。

以下是序列化反序列化的方法:

/**
     * 序列化bean物件的方法
     * @param object
     * @param clazz
     * @return
     * @throws FileNotFoundException
     */
    public  static <T> String setSerializableObject(Object object,Class<T> clazz ) throws FileNotFoundException {
        Kryo kryo = new Kryo();
        kryo.register(clazz, new BeanSerializer<T>(kryo, clazz));

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        Output output = new Output(baos);
        kryo.writeObject(output, object);
        output.flush();
        output.close();
        byte[] bys = baos.toByteArray();
        try {
            baos.flush();
            baos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        String string = new String(new Base64().encode(bys));

        System.out.println(string);

        return string;

    }


    /**
     * 反序列化bean物件的方法
     * @param clazz
     * @param data
     * @return
     */
    public static <T> Object getSerializableObject(Class<T> clazz, String data) {
        Kryo kryo = new Kryo();

        kryo.register(clazz, new BeanSerializer<T>(kryo, clazz)); //bean

        ByteArrayInputStream bais = new ByteArrayInputStream(new Base64().decode(data.getBytes()));
        Input input;
        Object simple = null;
        try {
            input = new Input(bais);
            input.close();
            simple = kryo.readObject(input, clazz);  //bean
            //simple = kryo.readObject(input, ArrayList.class, serializer);//list

        } catch (Exception e) {
            e.printStackTrace();
        }
        return simple;
    }


    /**
     * 序列化arrayList的方法
     * @param object
     * @param clazz
     * @return
     * @throws FileNotFoundException
     */
    public  static <T> String setSerializableList(Object object,Class<T> clazz ) throws FileNotFoundException {
        Kryo kryo = new Kryo();

        CollectionSerializer serializer = new CollectionSerializer();
        serializer.setElementClass(clazz, new BeanSerializer<T>(kryo, clazz));
        serializer.setElementsCanBeNull(false);

        kryo.register(clazz, new BeanSerializer<T>(kryo, clazz));
        kryo.register(ArrayList.class, serializer);


        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        Output output = new Output(baos);
        kryo.writeObject(output, object);
        output.flush();
        output.close();
        byte[] bys = baos.toByteArray();
        try {
            baos.flush();
            baos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        String string = new String(new Base64().encode(bys));

        System.out.println(string);

        return string;

    }

    /**
     * 反序列化ArrayList的方法
     * @param clazz
     * @param data
     * @return
     */
    public static <T> Object getSerializableList(Class<T> clazz, String data) {
        Kryo kryo = new Kryo();
        //List
        CollectionSerializer serializer = new CollectionSerializer();
        serializer.setElementClass(clazz, new BeanSerializer<T>(kryo, clazz));
        serializer.setElementsCanBeNull(false);

        kryo.register(clazz, new BeanSerializer<T>(kryo, clazz));
        kryo.register(ArrayList.class, serializer);

        ByteArrayInputStream bais = new ByteArrayInputStream(new Base64().decode(data.getBytes()));
        Input input;
        Object simple = null;
        try {
            input = new Input(bais);
            input.close();
            simple = kryo.readObject(input, ArrayList.class, serializer);//list

        } catch (Exception e) {
            e.printStackTrace();
        }
        return simple;
    }

    /**
     * 序列化HashMap<String, clazz>的方法  key為 String型別   value型別為 clazz
     * @param object
     * @param clazz
     * @return
     * @throws FileNotFoundException
     */
    public  static <T> String setSerializableMap(Object object,Class<T> clazz ) throws FileNotFoundException {
        Kryo kryo = new Kryo();
        //設定序列化map的key和value型別
        MapSerializer serializer = new MapSerializer();
        serializer.setKeyClass(String.class, new JavaSerializer());
        serializer.setKeysCanBeNull(false);
        serializer.setValueClass(clazz, new BeanSerializer<T>(kryo, clazz));
        serializer.setValuesCanBeNull(true);
        //註冊要序列化的物件
        kryo.register(HashMap.class, serializer);
        kryo.register(clazz, new BeanSerializer<T>(kryo, clazz));

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        Output output = new Output(baos);
        kryo.writeObject(output, object);
        output.flush();
        output.close();
        byte[] bys = baos.toByteArray();
        try {
            baos.flush();
            baos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        String string = new String(new Base64().encode(bys));
        System.out.println(string);

        return string;

    }

    /**
     * HashMap<String,clazz>型別的map反序列化。
     * @param clazz
     * @param data
     * @return
     */
    public static <T> Object getSerializableMap(Class<T> clazz, String data) {
        Kryo kryo = new Kryo();


        //Map
        MapSerializer serializer = new MapSerializer();
        serializer.setKeyClass(String.class, new JavaSerializer());
        serializer.setKeysCanBeNull(false);
        serializer.setValueClass(clazz, new BeanSerializer<T>(kryo, clazz));
        serializer.setValuesCanBeNull(true);

        kryo.register(HashMap.class, serializer);
        kryo.register(clazz, new BeanSerializer<T>(kryo, clazz)); //bean

        ByteArrayInputStream bais = new ByteArrayInputStream(new Base64().decode(data.getBytes()));
        Input input;
        Object simple = null;
        try {
            input = new Input(bais);
            input.close();
            simple = kryo.readObject(input, HashMap.class, serializer);  //bean
        } catch (Exception e) {
            e.printStackTrace();
        }
        return simple;
    }

相關推薦

Kryo序列序列

這是一個Kryo將複雜Bean物件序列化與反序列化,通過字串傳遞的列子。 具體的bean物件此處沒有附加程式碼,可以自己寫一個bean的例子,裡面可包含任何物件,集合,基本型別。但要求有geter和setter方法。 本人在本地測試類以下,除了Map需要Se

java jackson avro kryo等幾種序列序列化工具的使用

最近由於工作需要,需要研究常用的集中序列化方式,主要目的是物件序列化後佔用空間會大大減少,便於儲存和傳輸,下面是幾種序列化方式的使用demo 1. Java自帶的Serialize 依賴jar包:無 程式碼示意: import java.io.{ByteArrayInpu

Java核心類庫-IO-對象流(實現序列序列

.get throws 反序 code row cts new java cep 使用對象流來完成序列化和反序列化操作:   ObjectOutputStream:通過writeObject()方法做序列化操作的   ObjectInputStream:通過readObje

Java IO-5 序列序列

str ride log getname file urn turn objects transient 建一個Person類 1 package demo05; 2 3 import java.io.Serializable; 4 5 public cla

契約類相關的序列序列

pub ima cti 相關 ria 數據 num spa set 契約類指繼承了:DataContract的類。契約類常在WCF,webService等各種服務中作為傳輸數據使用。 凡是契約類或者繼承了契約類的類,如果想要屬性參與序列化與反序列化,需要在屬性上加上標記:D

Java序列序列

setname [] 進制 方式 gets 創建 保存 ati 取數據 Java序列化與反序列化是什麽?為什麽需要序列化與反序列化?如何實現Java序列化與反序列化?本文圍繞這些問題進行了探討。 1.Java序列化與反序列化 Java序列化是指把Java對象轉換為字節序

asp.net mvc中如何處理字符串對象之間的序列序列(一)

osi strong 類結構 plain pbo edate inf esc arp 前臺我們一般用ajax來發送數據到後端進行處理,如果json數據結構和後臺的實體類結構一致,就直接可以反序列化為指定的對象進行操作,非常方便。 前端發送的json數據結構: 後端實體結

C#對象序列序列

space ros 個人信息 瀏覽器 特性 點名 文件名 屬性節點 派生 1.對象序列化的介紹 (1).NET支持對象序列化的幾種方式 二進制序列化:對象序列化之後是二進制形式的,通過BinaryFormatter類來實現的,這個類位於System.Runtime.Seri

Java將對象寫入文件讀出——序列序列

ansi print 成員 trace 對象的引用 ack lose 靜態 spa Java類中對象的序列化工作是通過ObjectOutputStream和ObjectInputStream來完成的。 寫入: 1 File aFile=new File(

畢業項目畢業 -- pickle序列序列操作

style import 使用 python pan 項目 imp 序列化 操作 Python可以使用pickle做序列化: 序列化示例: import picklewith open(‘les.pickle‘, ‘wb‘) as f: pickle.du

C#語言-08.序列序列

clas 本質 cnblogs 語法 信息 字段 使用 serializa col a. 序列化:是將對象的狀態存儲到特定存儲介質中的過程 i. 語法:public void Serialize(序列化過程的文件流,保存的對象)

Day4 閉包、裝飾器decorator、叠代器生成器、面向過程編程、三元表達式、列表解析生成器表達式、序列序列

反序 bsp pic nbsp tor 序列 space 列表解析 列表 http://pic.cnhubei.com/space.php?uid=1774&do=album&id=1362489http://pic.cnhubei.com/space.ph

01. Java對象的序列序列簡介

語音 log -c object height 通訊 圖片 二進制 進程    Java對象的序列化與反序列化 ; 給大家講解一下什麽是序列化 & 反序列化      當兩個進程進行遠程通訊的時候,彼此相互可以發送各種類型的數據,如文本,圖片,語音和視頻等無論是任何

如何使用 JSON for Modern C++ 序列序列號,換行符導致序列失敗

http gb2 elf ldp c++ spi ssp 使用 b16 W48z士5742i4鍁鉀http://shequ.docin.com/qbvl66336 6j夠裝何掖tj嘔蔡5VLhttp://tushu.docin.com/olybb166 渤k搶97L巳綱鋅7

單例模式序列序列

int nts 如果 mex res tac tor cep ios package com.wz.thread.resolve;import java.io.ObjectStreamException;import java.io.Serializable;/** * 序

python-序列序列

ret bject 通用 for pla nco ray 字典 read 序列化模塊# 序列化方法# 格式轉換# 把python中的數據轉換成str---序列化# 可以str轉換成python的數據---反序列化 json模塊 # json所有的語言都通用,它能序列化的數

模塊講解----json模塊(跨平臺的序列序列

/usr 列表 strong 序列化 類型轉換 min 字符 虛擬 json 一、json的特點 1、只能處理簡單的可序列化的對象;(字典,列表,元祖) 2、json支持不同語言之間的數據交互;(python - go,python - java) 二、使用場

【轉】C# 序列序列

使用 ria tle 輸入 == 必須 mls zab ddr 轉自:https://www.cnblogs.com/lsy131479/p/8371858.html 對象持久化到文本文件,策略是:將對象的屬性值打散,拆解,分別存儲。 序列化: 保存對象的"全景圖" 序

JSON序列序列

class a using demo pos define sys ali convert lose 1.add reference [System.Runtime.Serializatio] 2.using [System.Runtime.Serialization] a

C#序列序列

color bsp private start sys bin create body null 一、序列化: 1 public void SerilizeData() 2 { 3 FileStream fs =