1. 程式人生 > >java序列化和json序列化效率對比

java序列化和json序列化效率對比

一、背景

有專案需要傳輸Map結構的資料,有人傾向用Java序列化來做,有人傾向用JSON的序列化來做。所以我們還是比比吧。

Java觀點:Object2Object,使用時簡單快速。

JSON觀點:JSON格式與語言無關,擴充套件性強,速度也應該不慢。

大家可能對Java序列化都有一個錯誤的認識,認為Java序列化比JSON的序列化效率高並且序列化的資料小,其實實際上並不一定是這樣,我這次就想通過實際測試來解開這個謎團

二、測試方式

測試同一個Map<String,Object>並序列化為byte[],並再將byte[]反序列化為Map<String,Object>的過程。Object中包括String,Integer,Long,Boolean,Float,Double常規型別的資料。

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

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

測試各種大小不同的Map,並迴圈執行同一操作N次,來得到一個相對穩定的線性結果。

三、比較的物件

JAVA:

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

JSON:

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

、比較結果

Map大小(10-100)迴圈10萬次

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

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


序列化時間彙總比較(y為序列化與反序列化總時間ms)

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

Map大小(100-1000)迴圈1萬次

序列化時間比較(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介面

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 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); }
JavaSerializationTest ?
1 2 3 4 5 6

相關推薦

java序列json序列效率對比

一、背景 有專案需要傳輸Map結構的資料,有人傾向用Java序列化來做,有人傾向用JSON的序列化來做。所以我們還是比比吧。 Java觀點:Object2Object,使用時簡單快速。 JSON觀點:JSON格式與語言無關,擴充套件性強,速度也應該不

C#中的XML序列Json序列,普通陣列轉位元組陣列

C#在於其他語言進行資料通訊時,直接傳遞的時二進位制的位元組碼,而一個要傳遞的物件的二進位制位元組碼在C#中有很多表示方法。其中直接轉換為Byte陣列和序列化未byte陣列,還有xml序列化,json序列化最未常用,下面簡單舉例介紹一下這幾種方法。 usin

java 常用序列序列框架使用-json,kyro,jdk

不知道為什麼部落格不能收藏了,只好轉載過來。 轉載地址:http://blog.csdn.net/earbao/article/details/46914407 package com.baidu.test;   import java.io

Java中的JSON序列序列 Vo的轉換

     /**  * 由字串反序列化成實體類  針對的是一個實體,此實體中的屬性不包括自定義的型別,如Teacher型別,或者List<Teacher>型別   * @param source 傳入json中的字串  * @param beanClass 實體類的型別  * @return 實體

C# Json序列序列

ava script brush arp turn bject new c# 序列化 using System.Web.Script.Serialization; public class JsonHelper { public static string Ob

java中什麽是序列序列

zab question .com 程序 還原 破壞 ans 但我 實現 序列化:能夠把一個對象用二進制的表示出來。 類似我第一個字節表示什麽屬性名詞,第二個字節表示什麽屬性值,第幾個字段表示有幾個屬性等。 而且這個二進制可以寫到硬

json對象的序列序列

name .cn .net序列化 object cnblogs json log con com //Json.NET序列化 string jsonData = JsonConvert.SerializeObject(對象model);

基於Json序列序列通用的封裝

result .html stream ctr 相似性 tac ram 等等 newton 1. 最近項目已經上線了 ,閑暇了幾天 想將JSON的序列化以及反序列化進行重新的封裝一下本人定義為JSONHelp,雖然Microsoft 已經做的很好了。但是我想封裝一套為自己開

ASP.NET 中JSON序列序列

urn 序列 del nbsp parseint 代碼 href end user JSON是專門為瀏覽器中的網頁上運行的JavaScript代碼而設計的一種數據格式。在網站應用中使用JSON的場景越來越多,本文介紹ASP.NET中JSON的序列化和反序列化,主要對JSON

序列Json

pic pytho spa list pick open mil load pickle 實現了python與python程序之間內存的交互 常用場景: 1 把內存的數據寫到磁盤 2 socket只能傳字符串,二進制,通過序列化 ======================

json/pickle- 序列序列

內部 int strong 回來 color lex 數據類型 硬盤 json json只能處理簡單的數據類型。列表,字典,字符串等。函數不行。用於不同語言之間的相互轉化。 編碼:把一個Python對象編碼轉換成Json字符串 json.dumps() 把內存的數據對象

Python學習心得(五) random生成驗證碼、MD5加密、pickle與json序列序列

用法 div com ict file imp randint csdn == # -*- coding:utf-8 -*- import random as rd #驗證碼 import hashlib as hsl #MD5加密 import pickle,json

java中的序列序列學習筆記

文件 track 反序列化 out val nts 鼠標 main version 須要序列化的Person類: package cn.itcast_07; import java.io.Serializable; /* * NotSerializableE

ASP.NET中JSON序列序列

沒有 helper mic lar width pty on() dmi 包括 JSON是專門為瀏覽器中的網頁上運行的JavaScript代碼而設計的一種數據格式。在網站應用中使用JSON的場景越來越多,本文介紹ASP.NET中JSON的序列化和反序列化,主要對JSON的

java對象的序列序列

底層 修飾 我們 puts nbsp tostring read one asics 一,對象的序列化,反序列化1.對象的序列化,就是將Object轉換成byte序列,反之叫對象的反序列化2.做序列化需要有流類,序列化流(ObjectOutputStream),是(字節的)

python學習第四天,列表生產式,匿名函數,生成器,內置函數,叠代器,裝飾器,jsonpickle的序列序列

數據 其他 imp 函數名 fun pro serializa and cal 列表生成式,生產器 #列表生成式,可以是代碼更復雜 a = [i for i in range(10)] #這裏的i,可以使用函數來裝飾 print(a) #生產器:就是數據在調用的時候才有

json序列序列

load 序列 文件 pytho txt 反序 code print odin 代替eval 序列化: #! /usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "Deakin" # Email: 4697

json 序列序列

scrip 反序列化 mit ava PE 傳遞數據 以及 name col 一: 兩種數據傳輸方式   服務器傳遞數據到客戶端,主要又兩種數據傳輸格式,json 和 xml。 二: json 形式: { "employees": [ { "fir

java基礎序--列序列

color tran public png gin jdk style 硬盤 brush 一、什麽是序列化和反序列化:   序列化:是指把java堆內存中的對象轉換成字節(二進制流)的過程。也就是通過某種方式將java對象存儲在磁盤內存中,這個過程稱為序列化   反序列化:

.NET中JSON序列序列的幾種方式

存儲 ati mas int font javascrip AS memory 種類 一、什麽是JSON JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數據交換格式。它基於 ECMAScript (歐洲計算機協會制