反序列化時間比較(y為反序列化時間ms)
序列化時間匯總比較(y為序列化與反序列化總時間ms)
序列化後byte大小比較(由於同類線重合顯示為2條線)
序列化時間比較(y為序列化時間ms)
反序列化時間比較(y為反序列化時間ms)
序列化時間匯總比較(y為序列化與反序列化總時間ms)
序列化後byte大小比較(由於同類線重合顯示為2條線)
Map在小於100時:
Java的反序列化時的性能要比Java序列化時性能差很多,1.5倍左右差距。
JSON序列化性能明顯由於Java序列化性能,尤其是反序列化過程。並且序列化後的數據大小也是JSON格式的小。
Map在大於100小於1000時:
Java的反序列化時的性能並沒有隨Map的大小變化而變差。
JSON陣營中Gson在序列化過程中,比Java只快了那麼一點點。在反序列化過程中Gson開始領先與Java,但在Map的大小過700多以後,Gson的反序列化性能比Java要慢。但JSON陣營中的json-smart依然表現出色完全是兩個級別。
並不是Java的序列化速度總是最快體積最小,Java需要考慮對象類型,屬性類型與內部對象信息等一系列對數據本身並不相關的內容的處理。JSON以固定的格式,穩定簡單的數據結構大大簡化了序列化過程,雖然也要創建新的Java數據對象但並不會比Java反序列化的速度慢。
從測試結果上看JSON的json-smart更適合項目的需要。
SerializationTest接口
package org.noahx.javavsjson; import java.util.Map; /** * Created with IntelliJ IDEA. * User: noah * Date: 3/8/13 * Time: 9:59 PM * To change this template use File | Settings | File Templates. */ public interface SerializationTest { public String getTestName(); public Map<String, Object> testBytes2Map(byte[] bytes); public byte[] testMap2Bytes(Map<String, Object> map); }
package org.noahx.javavsjson; import java.io.*; import java.util.Map; /** * Created with IntelliJ IDEA. * User: noah * Date: 3/8/13 * Time: 10:05 PM * To change this template use File | Settings | File Templates. */ public class JavaSerializationTest implements SerializationTest { @Override public String getTestName() { return "Java"; } @Override public Map<String, Object> testBytes2Map(byte[] bytes) { Map<String, Object> result = null; try { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream); result = (Map<String, Object>) inputStream.readObject(); inputStream.close(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } @Override public byte[] testMap2Bytes(Map<String, Object> map) { byte[] bytes = null; try { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream outputStream = new ObjectOutputStream(byteArrayOutputStream); outputStream.writeObject(map); outputStream.close(); bytes = byteArrayOutputStream.toByteArray(); } catch (IOException e) { e.printStackTrace(); } return bytes; } }
package org.noahx.javavsjson; import org.apache.commons.lang3.SerializationUtils; import java.io.Serializable; import java.util.Map; /** * Created with IntelliJ IDEA. * User: noah * Date: 3/9/13 * Time: 2:24 AM * To change this template use File | Settings | File Templates. */ public class CommonLang3SerializationTest implements SerializationTest { @Override public String getTestName() { return "Commons Lang3"; } @Override public Map<String, Object> testBytes2Map(byte[] bytes) { return (Map<String, Object>) SerializationUtils.deserialize(bytes); } @Override public byte[] testMap2Bytes(Map<String, Object> map) { return SerializationUtils.serialize((Serializable) map); } }
package org.noahx.javavsjson; import com.google.gson.Gson; import java.io.UnsupportedEncodingException; import java.util.Map; /** * Created with IntelliJ IDEA. * User: noah * Date: 3/8/13 * Time: 10:02 PM * To change this template use File | Settings | File Templates. */ public class GsonSerializationTest implements SerializationTest { private Gson gson; public GsonSerializationTest() { gson = new Gson(); } @Override public String getTestName() { return "Gson"; } @Override public Map<String, Object> testBytes2Map(byte[] bytes) { Map<String, Object> result = null; try { result = gson.fromJson(new String(bytes, "UTF-8"), Map.class); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return result; } @Override public byte[] testMap2Bytes(Map<String, Object> map) { String str = gson.toJson(map); byte[] bytes = null; try { bytes = str.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return bytes; } }
package org.noahx.javavsjson; import net.minidev.json.JSONObject; import net.minidev.json.JSONValue; import net.minidev.json.parser.ParseException; import java.io.UnsupportedEncodingException; import java.util.Map; /** * Created with IntelliJ IDEA. * User: noah * Date: 3/9/13 * Time: 1:30 AM * To change this template use File | Settings | File Templates. */ public class JsonSmartSerializationTest implements SerializationTest { @Override public String getTestName() { return "Json Smart"; } @Override public Map<String, Object> testBytes2Map(byte[] bytes) { Map<String, Object> map = null; try { map = (Map<String, Object>) JSONValue.parseStrict((new String(bytes, "UTF-8"))); } catch (ParseException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return map; } @Override public byte[] testMap2Bytes(Map<String, Object> map) { String str = JSONObject.toJSONString(map); byte[] result = null; try { result = str.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return result; } }