成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java序列化與JSON序列化大比拼

開發(fā) 后端
大家可能對(duì)Java序列化都有一個(gè)錯(cuò)誤的認(rèn)識(shí),認(rèn)為Java序列化比JSON的序列化效率高并且序列化的數(shù)據(jù)小,其實(shí)實(shí)際上并不一定是這樣,我這次就想通過實(shí)際測(cè)試來解開這個(gè)謎團(tuán)。

一、背景

有項(xiàng)目需要傳輸Map結(jié)構(gòu)的數(shù)據(jù),有人傾向用Java序列化來做,有人傾向用JSON的序列化來做。所以我們還是比比吧。

Java觀點(diǎn):Object2Object,使用時(shí)簡(jiǎn)單快速。

JSON觀點(diǎn):JSON格式與語言無關(guān),擴(kuò)展性強(qiáng),速度也應(yīng)該不慢。

大家可能對(duì)Java序列化都有一個(gè)錯(cuò)誤的認(rèn)識(shí),認(rèn)為Java序列化比JSON的序列化效率高并且序列化的數(shù)據(jù)小,其實(shí)實(shí)際上并不一定是這樣,我這次就想通過實(shí)際測(cè)試來解開這個(gè)謎團(tuán)。

二、測(cè)試方式

測(cè)試同一個(gè)Map<String,Object>并序列化為byte[],并再將byte[]反序列化為 Map<String,Object>的過程。Object中包括 String,Integer,Long,Boolean,F(xiàn)loat,Double常規(guī)類型的數(shù)據(jù)。

序列化:Map<String,Object> -> byte[]

反序列化:byte[] -> Map<String,Object>

測(cè)試各種大小不同的Map,并循環(huán)執(zhí)行同一操作N次,來得到一個(gè)相對(duì)穩(wěn)定的線性結(jié)果。

三、比較的對(duì)象

JAVA:

手寫Java(1.6.0_32)與Common Lang3(3.1)的SerializationUtils。

JSON:

將采用Gson(2.2.2)與json-smart(2.0-RC2)兩種不同的JSON解析器。json-smart號(hào)稱是速度最快的JSON解析器。

四、比較結(jié)果

Map大小(10-100)循環(huán)10萬次

序列化時(shí)間比較(y為序列化時(shí)間ms)

反序列化時(shí)間比較(y為反序列化時(shí)間ms)

序列化時(shí)間匯總比較(y為序列化與反序列化總時(shí)間ms)

序列化后byte大小比較(由于同類線重合顯示為2條線)

Map大小(100-1000)循環(huán)1萬次

序列化時(shí)間比較(y為序列化時(shí)間ms)

反序列化時(shí)間比較(y為反序列化時(shí)間ms)

序列化時(shí)間匯總比較(y為序列化與反序列化總時(shí)間ms)

序列化后byte大小比較(由于同類線重合顯示為2條線)

比較總結(jié)

Map在小于100時(shí):

Java的反序列化時(shí)的性能要比Java序列化時(shí)性能差很多,1.5倍左右差距。

JSON序列化性能明顯由于Java序列化性能,尤其是反序列化過程。并且序列化后的數(shù)據(jù)大小也是JSON格式的小。

Map在大于100小于1000時(shí):

Java的反序列化時(shí)的性能并沒有隨Map的大小變化而變差。

JSON陣營中Gson在序列化過程中,比Java只快了那么一點(diǎn)點(diǎn)。在反序列化過程中Gson開始領(lǐng)先與Java,但在Map的大小過700多以后,Gson的反序列化性能比Java要慢。但JSON陣營中的json-smart依然表現(xiàn)出色完全是兩個(gè)級(jí)別。

并不是Java的序列化速度總是最快體積最小,Java需要考慮對(duì)象類型,屬性類型與內(nèi)部對(duì)象信息等一系列對(duì)數(shù)據(jù)本身并不相關(guān)的內(nèi)容的處理。JSON以固定的格式,穩(wěn)定簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)大大簡(jiǎn)化了序列化過程,雖然也要?jiǎng)?chuàng)建新的Java數(shù)據(jù)對(duì)象但并不會(huì)比Java反序列化的速度慢。

從測(cè)試結(jié)果上看JSON的json-smart更適合項(xiàng)目的需要。

#p#

五、測(cè)試代碼源碼

SerializationTest接口

  1. package org.noahx.javavsjson;  
  2.  
  3. import java.util.Map;  
  4.  
  5. /**  
  6.  * Created with IntelliJ IDEA.  
  7.  * User: noah  
  8.  * Date: 3/8/13  
  9.  * Time: 9:59 PM  
  10.  * To change this template use File | Settings | File Templates.  
  11.  */ 
  12. public interface SerializationTest {  
  13.  
  14.     public String getTestName();  
  15.  
  16.     public Map<String, Object> testBytes2Map(byte[] bytes);  
  17.  
  18.     public byte[] testMap2Bytes(Map<String, Object> map);  
  19. }  

JavaSerializationTest

  1. package org.noahx.javavsjson;  
  2.  
  3. import java.io.*;  
  4. import java.util.Map;  
  5.  
  6. /**  
  7.  * Created with IntelliJ IDEA.  
  8.  * User: noah  
  9.  * Date: 3/8/13  
  10.  * Time: 10:05 PM  
  11.  * To change this template use File | Settings | File Templates.  
  12.  */ 
  13. public class JavaSerializationTest implements SerializationTest {  
  14.  
  15.     @Override 
  16.     public String getTestName() {  
  17.         return "Java";  
  18.     }  
  19.  
  20.     @Override 
  21.     public Map<String, Object> testBytes2Map(byte[] bytes) {  
  22.         Map<String, Object> result = null;  
  23.         try {  
  24.             ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);  
  25.             ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream);  
  26.  
  27.             result = (Map<String, Object>) inputStream.readObject();  
  28.             inputStream.close();  
  29.         } catch (ClassNotFoundException e) {  
  30.             e.printStackTrace();  
  31.         } catch (IOException e) {  
  32.             e.printStackTrace();  
  33.         }  
  34.  
  35.         return result;  
  36.     }  
  37.  
  38.     @Override 
  39.     public byte[] testMap2Bytes(Map<String, Object> map) {  
  40.         byte[] bytes = null;  
  41.         try {  
  42.             ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  
  43.             ObjectOutputStream outputStream = new ObjectOutputStream(byteArrayOutputStream);  
  44.  
  45.             outputStream.writeObject(map);  
  46.             outputStream.close();  
  47.  
  48.             bytes = byteArrayOutputStream.toByteArray();  
  49.         } catch (IOException e) {  
  50.             e.printStackTrace();  
  51.         }  
  52.         return bytes;  
  53.     }  
  54. }  

CommonLang3SerializationTest

  1. package org.noahx.javavsjson;  
  2.  
  3. import org.apache.commons.lang3.SerializationUtils;  
  4. import java.io.Serializable;  
  5. import java.util.Map;  
  6.  
  7. /**  
  8.  * Created with IntelliJ IDEA.  
  9.  * User: noah  
  10.  * Date: 3/9/13  
  11.  * Time: 2:24 AM  
  12.  * To change this template use File | Settings | File Templates.  
  13.  */ 
  14. public class CommonLang3SerializationTest implements SerializationTest {  
  15.     @Override 
  16.     public String getTestName() {  
  17.         return "Commons Lang3";  
  18.     }  
  19.  
  20.     @Override 
  21.     public Map<String, Object> testBytes2Map(byte[] bytes) {  
  22.         return (Map<String, Object>) SerializationUtils.deserialize(bytes);  
  23.     }  
  24.  
  25.     @Override 
  26.     public byte[] testMap2Bytes(Map<String, Object> map) {  
  27.         return SerializationUtils.serialize((Serializable) map);  
  28.     }  
  29. }  

GsonSerializationTest

  1. package org.noahx.javavsjson;  
  2.  
  3. import com.google.gson.Gson;  
  4. import java.io.UnsupportedEncodingException;  
  5. import java.util.Map;  
  6.  
  7. /**  
  8.  * Created with IntelliJ IDEA.  
  9.  * User: noah  
  10.  * Date: 3/8/13  
  11.  * Time: 10:02 PM  
  12.  * To change this template use File | Settings | File Templates.  
  13.  */ 
  14. public class GsonSerializationTest implements SerializationTest {  
  15.  
  16.     private Gson gson;  
  17.  
  18.     public GsonSerializationTest() {  
  19.         gson = new Gson();  
  20.     }  
  21.  
  22.     @Override 
  23.     public String getTestName() {  
  24.         return "Gson";  
  25.     }  
  26.  
  27.     @Override 
  28.     public Map<String, Object> testBytes2Map(byte[] bytes) {  
  29.         Map<String, Object> result = null;  
  30.         try {  
  31.             result = gson.fromJson(new String(bytes, "UTF-8"), Map.class);  
  32.         } catch (UnsupportedEncodingException e) {  
  33.             e.printStackTrace();  
  34.         }  
  35.         return result;  
  36.     }  
  37.  
  38.     @Override 
  39.     public byte[] testMap2Bytes(Map<String, Object> map) {  
  40.         String str = gson.toJson(map);  
  41.         byte[] bytes = null;  
  42.         try {  
  43.             bytes = str.getBytes("UTF-8");  
  44.         } catch (UnsupportedEncodingException e) {  
  45.             e.printStackTrace();  
  46.         }  
  47.         return bytes;  
  48.     }  
  49. }  

JsonSmartSerializationTest

  1. package org.noahx.javavsjson;  
  2.  
  3. import net.minidev.json.JSONObject;  
  4. import net.minidev.json.JSONValue;  
  5. import net.minidev.json.parser.ParseException;  
  6. import java.io.UnsupportedEncodingException;  
  7. import java.util.Map;  
  8.  
  9. /**  
  10.  * Created with IntelliJ IDEA.  
  11.  * User: noah  
  12.  * Date: 3/9/13  
  13.  * Time: 1:30 AM  
  14.  * To change this template use File | Settings | File Templates.  
  15.  */ 
  16. public class JsonSmartSerializationTest implements SerializationTest {  
  17.     @Override 
  18.     public String getTestName() {  
  19.         return "Json Smart";  
  20.     }  
  21.  
  22.     @Override 
  23.     public Map<String, Object> testBytes2Map(byte[] bytes) {  
  24.         Map<String, Object> map = null;  
  25.         try {  
  26.             map = (Map<String, Object>) JSONValue.parseStrict((new String(bytes, "UTF-8")));  
  27.         } catch (ParseException e) {  
  28.             e.printStackTrace();  
  29.         } catch (UnsupportedEncodingException e) {  
  30.             e.printStackTrace();  
  31.         }  
  32.         return map;  
  33.     }  
  34.  
  35.     @Override 
  36.     public byte[] testMap2Bytes(Map<String, Object> map) {  
  37.         String str = JSONObject.toJSONString(map);  
  38.         byte[] result = null;  
  39.         try {  
  40.             result = str.getBytes("UTF-8");  
  41.         } catch (UnsupportedEncodingException e) {  
  42.             e.printStackTrace();  
  43.         }  
  44.         return result;  
  45.     }  
  46. }  

源碼下載:http://sdrv.ms/12ECmgG

P.S.

我也測(cè)試過Map<String,String>固定數(shù)據(jù)類型value只為String的情況,這時(shí)Java與JSON的性能的差距會(huì)減小,但JSON序列化性能與數(shù)據(jù)大小還是占優(yōu)勢(shì),尤其是反序列化的速度JSON更出色。

Gson在數(shù)值反序列化后,因?yàn)镺bject無法確定類型,Map中的Long,Integer,F(xiàn)loat統(tǒng)一轉(zhuǎn)為了Double類型。

json-smart不一樣,如果整數(shù)超過Integer的范圍轉(zhuǎn)Long,沒有超過轉(zhuǎn)Integer。浮點(diǎn)Float轉(zhuǎn)為Double類型。

原文鏈接:http://my.oschina.net/noahxiao/blog/112759

責(zé)任編輯:張偉 來源: oschina
相關(guān)推薦

2018-03-19 10:20:23

Java序列化反序列化

2022-08-06 08:41:18

序列化反序列化Hessian

2023-12-13 13:49:52

Python序列化模塊

2021-11-18 07:39:41

Json 序列化Vue

2012-04-13 10:45:59

XML

2011-06-01 15:05:02

序列化反序列化

2009-08-24 17:14:08

C#序列化

2009-07-29 13:39:02

JSON序列化和反序列ASP.NET AJA

2009-06-14 22:01:27

Java對(duì)象序列化反序列化

2011-05-18 15:20:13

XML

2009-08-06 11:16:25

C#序列化和反序列化

2018-01-17 16:38:07

MSONJSON序列化

2009-08-25 14:24:36

C#序列化和反序列化

2011-06-01 14:50:48

2019-11-20 10:07:23

web安全PHP序列化反序列化

2011-06-01 14:26:11

序列化

2023-11-20 08:44:18

數(shù)據(jù)序列化反序列化

2010-03-19 15:54:21

Java Socket

2011-03-04 09:25:51

Java序列化

2009-08-25 14:43:26

C#序列化和反序列化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美日韩视频在线 | 国产最新网址 | 亚洲综合小视频 | 久草在线在线精品观看 | 亚洲国产成人av好男人在线观看 | 一区二区三区四区免费视频 | 国产区免费视频 | 亚洲综合国产精品 | 97久久精品午夜一区二区 | 精品一二区 | 欧美综合自拍 | 亚洲国产精品一区二区三区 | 国产一区二区精品在线观看 | 精品日韩在线 | 免费在线观看黄网站 | 91av在线免费播放 | 欧美1区2区 | 国产九九九九 | 狠狠草视频 | 看毛片网站 | 九色在线观看 | 成人1区| 成人国产在线视频 | 亚洲精品一区在线 | 久久亚洲国产 | a精品视频 | 中文字幕精品一区二区三区精品 | 色先锋影音 | 国产在线一区二 | 一区二区av | 精品自拍视频 | 欧美一区二区三区四区五区无卡码 | 亚洲精品一区二区在线观看 | 欧美a视频 | 成人免费三级电影 | 爱爱视频日本 | 麻豆久久精品 | zzzwww在线看片免费 | 日韩国产欧美一区 | 日韩成人影院在线观看 | 欧美一区在线看 |