日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java序列化常見實現方法代碼實例

瀏覽:26日期:2022-08-21 08:03:19

0、前言

本文主要對幾種常見Java序列化方式進行實現。包括Java原生以流的方法進行的序列化、Json序列化、FastJson序列化、Protobuff序列化。

1、Java原生序列化

Java原生序列化方法即通過Java原生流(InputStream和OutputStream之間的轉化)的方式進行轉化。需要注意的是JavaBean實體類必須實現Serializable接口,否則無法序列化。Java原生序列化代碼示例如下所示:

package serialize;import java.io.BufferedInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.util.ArrayList;import java.util.List;/** * * @author liqqc * */public class JavaSerialize { public static void main(String[] args) throws ClassNotFoundException, IOException { new JavaSerialize().start(); } public void start() throws IOException, ClassNotFoundException { User u = new User(); List<User> friends = new ArrayList<>(); u.setUserName('張三'); u.setPassWord('123456'); u.setUserInfo('張三是一個很牛逼的人'); u.setFriends(friends); User f1 = new User(); f1.setUserName('李四'); f1.setPassWord('123456'); f1.setUserInfo('李四是一個很牛逼的人'); User f2 = new User(); f2.setUserName('王五'); f2.setPassWord('123456'); f2.setUserInfo('王五是一個很牛逼的人'); friends.add(f1); friends.add(f2); Long t1 = System.currentTimeMillis(); ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream obj = new ObjectOutputStream(out); for(int i = 0; i<10; i++) { obj.writeObject(u); } System.out.println('java serialize: ' +(System.currentTimeMillis() - t1) + 'ms; 總大小:' + out.toByteArray().length ); Long t2 = System.currentTimeMillis(); ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new java.io.ByteArrayInputStream(out.toByteArray()))); User user = (User) ois.readObject(); System.out.println('java deserialize: ' + (System.currentTimeMillis() - t2) + 'ms; User: ' + user); }}

運行結果:

java serialize: 8ms; 總大小:420java deserialize: 1ms; User: User [userId=null, userName=張三, passWord=123456, userInfo=張三是一個很牛逼的人, friends=[User [userId=null, userName=李四, passWord=123456, userInfo=李四是一個很牛逼的人, friends=null], User [userId=null, userName=王五, passWord=123456, userInfo=王五是一個很牛逼的人, friends=null]]]

2、Json序列化

Json序列化一般會使用jackson包,通過ObjectMapper類來進行一些操作,比如將對象轉化為byte數組或者將json串轉化為對象。現在的大多數公司都將json作為服務器端返回的數據格式。比如調用一個服務器接口,通常的請求為xxx.json?a=xxx&b=xxx的形式。Json序列化示例代碼如下所示:

package serialize;import java.io.IOException;import java.util.ArrayList;import java.util.List;import com.fasterxml.jackson.databind.ObjectMapper;/** * * @author liqqc * */public class JsonSerialize { public static void main(String[] args) throws IOException { new JsonSerialize().start(); } public void start() throws IOException { User u = new User(); List<User> friends = new ArrayList<>(); u.setUserName('張三'); u.setPassWord('123456'); u.setUserInfo('張三是一個很牛逼的人'); u.setFriends(friends); User f1 = new User(); f1.setUserName('李四'); f1.setPassWord('123456'); f1.setUserInfo('李四是一個很牛逼的人'); User f2 = new User(); f2.setUserName('王五'); f2.setPassWord('123456'); f2.setUserInfo('王五是一個很牛逼的人'); friends.add(f1); friends.add(f2); ObjectMapper mapper = new ObjectMapper(); Long t1 = System.currentTimeMillis(); byte[] writeValueAsBytes = null; for (int i = 0; i < 10; i++) { writeValueAsBytes = mapper.writeValueAsBytes(u); } System.out.println('json serialize: ' + (System.currentTimeMillis() - t1) + 'ms; 總大小:' + writeValueAsBytes.length); Long t2 = System.currentTimeMillis(); User user = mapper.readValue(writeValueAsBytes, User.class); System.out.println('json deserialize: ' + (System.currentTimeMillis() - t2) + 'ms; User: ' + user); }}

運行結果:

json serialize: 55ms; 總大小:341json deserialize: 35ms; User: User [userId=null, userName=張三, passWord=123456, userInfo=張三是一個很牛逼的人, friends=[User [userId=null, userName=李四, passWord=123456, userInfo=李四是一個很牛逼的人, friends=null], User [userId=null, userName=王五, passWord=123456, userInfo=王五是一個很牛逼的人, friends=null]]]

3、FastJson序列化

fastjson 是由阿里巴巴開發的一個性能很好的Java 語言實現的 Json解析器和生成器。特點:速度快,測試表明fastjson具有極快的性能,超越任其他的java json parser。功能強大,完全支持java bean、集合、Map、日期、Enum,支持范型和自省。無依賴,能夠直接運行在Java SE 5.0以上版本

支持Android。使用時候需引入FastJson第三方jar包。FastJson序列化代碼示例如下所示:

package serialize;import java.util.ArrayList;import java.util.List;import com.alibaba.fastjson.JSON;/** * * @author liqqc * */public class FastJsonSerialize { public static void main(String[] args) { new FastJsonSerialize().start(); } public void start(){ User u = new User(); List<User> friends = new ArrayList<>(); u.setUserName('張三'); u.setPassWord('123456'); u.setUserInfo('張三是一個很牛逼的人'); u.setFriends(friends); User f1 = new User(); f1.setUserName('李四'); f1.setPassWord('123456'); f1.setUserInfo('李四是一個很牛逼的人'); User f2 = new User(); f2.setUserName('王五'); f2.setPassWord('123456'); f2.setUserInfo('王五是一個很牛逼的人'); friends.add(f1); friends.add(f2); //序列化 Long t1 = System.currentTimeMillis(); String text = null; for(int i = 0; i<10; i++) { text = JSON.toJSONString(u); } System.out.println('fastJson serialize: ' +(System.currentTimeMillis() - t1) + 'ms; 總大小:' + text.getBytes().length); //反序列化 Long t2 = System.currentTimeMillis(); User user = JSON.parseObject(text, User.class); System.out.println('fastJson serialize: ' + (System.currentTimeMillis() -t2) + 'ms; User: ' + user); }}

運行結果:

fastJson serialize: 284ms; 總大小:269fastJson serialize: 26ms; User: User [userId=null, userName=張三, passWord=123456, userInfo=張三是一個很牛逼的人, friends=[User [userId=null, userName=李四, passWord=123456, userInfo=李四是一個很牛逼的人, friends=null], User [userId=null, userName=王五, passWord=123456, userInfo=王五是一個很牛逼的人, friends=null]]]

4、ProtoBuff序列化

ProtocolBuffer是一種輕便高效的結構化數據存儲格式,可以用于結構化數據序列化。適合做數據存儲或 RPC 數據交換格式。可用于通訊協議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式。

優點:跨語言;序列化后數據占用空間比JSON小,JSON有一定的格式,在數據量上還有可以壓縮的空間。

缺點:它以二進制的方式存儲,無法直接讀取編輯,除非你有 .proto 定義,否則無法直接讀出 Protobuffer的任何內容。

其與thrift的對比:兩者語法類似,都支持版本向后兼容和向前兼容,thrift側重點是構建跨語言的可伸縮的服務,支持的語言多,同時提供了全套RPC解決方案,可以很方便的直接構建服務,不需要做太多其他的工作。 Protobuffer主要是一種序列化機制,在數據序列化上進行性能比較,Protobuffer相對較好。

ProtoBuff序列化對象可以很大程度上將其壓縮,可以大大減少數據傳輸大小,提高系統性能。對于大量數據的緩存,也可以提高緩存中數據存儲量。原始的ProtoBuff需要自己寫.proto文件,通過編譯器將其轉換為java文件,顯得比較繁瑣。百度研發的jprotobuf框架將Google原始的protobuf進行了封裝,對其進行簡化,僅提供序列化和反序列化方法。其實用上也比較簡潔,通過對JavaBean中的字段進行注解就行,不需要撰寫.proto文件和實用編譯器將其生成.java文件,百度的jprotobuf都替我們做了這些事情了。

一個帶有jprotobuf注解的JavaBean如下所示,如果你想深入學習可以參照https://github.com/google/protobuf

package serialize;import java.io.Serializable;import java.util.List;import com.baidu.bjf.remoting.protobuf.FieldType;import com.baidu.bjf.remoting.protobuf.annotation.Protobuf;public class User implements Serializable { private static final long serialVersionUID = -7890663945232864573L; @Protobuf(fieldType = FieldType.INT32, required = false, order = 1) private Integer userId; @Protobuf(fieldType = FieldType.STRING, required = false, order = 2) private String userName; @Protobuf(fieldType = FieldType.STRING, required = false, order = 3) private String passWord; @Protobuf(fieldType = FieldType.STRING, required = false, order = 4) private String userInfo; @Protobuf(fieldType = FieldType.OBJECT, required = false, order = 5) private List<User> friends; public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } public String getUserInfo() { return userInfo; } public void setUserInfo(String userInfo) { this.userInfo = userInfo; } public List<User> getFriends() { return friends; } public void setFriends(List<User> friends) { this.friends = friends; } @Override public String toString() { return 'User [userId=' + userId + ', userName=' + userName + ', passWord=' + passWord + ', userInfo=' + userInfo+ ', friends=' + friends + ']'; }}

jprotobuf序列化代碼示例如下所示:

package serialize;import java.io.IOException;import java.util.ArrayList;import java.util.List;import com.baidu.bjf.remoting.protobuf.Codec;import com.baidu.bjf.remoting.protobuf.ProtobufProxy;/** * * @author liqqc * */public class ProtoBuffSerialize { public static void main(String[] args) throws IOException { new ProtoBuffSerialize().start(); } public void start() throws IOException { Codec<User> studentClassCodec = ProtobufProxy.create(User.class, false); User u2 = new User(); List<User> friends = new ArrayList<>(); u2.setUserName('張三'); u2.setPassWord('123456'); u2.setUserInfo('張三是一個很牛逼的人'); u2.setFriends(friends); User f1 = new User(); f1.setUserName('李四'); f1.setPassWord('123456'); f1.setUserInfo('李四是一個很牛逼的人'); User f2 = new User(); f2.setUserName('王五'); f2.setPassWord('123456'); f2.setUserInfo('王五是一個很牛逼的人'); friends.add(f1); friends.add(f2); Long stime_jpb_encode = System.currentTimeMillis(); byte[] bytes = null; for(int i = 0; i<10; i++) { bytes = studentClassCodec.encode(u2); } System.out.println('jprotobuf序列化耗時:' + (System.currentTimeMillis() - stime_jpb_encode) + 'ms; 總大小:' + bytes.length); Long stime_jpb_decode = System.currentTimeMillis(); User user = studentClassCodec.decode(bytes); Long etime_jpb_decode = System.currentTimeMillis(); System.out.println('jprotobuf反序列化耗時:'+ (etime_jpb_decode-stime_jpb_decode) + 'ms; User: ' + user); }}

運行結果:

jprotobuf序列化耗時:9ms; 總大小:148jprotobuf反序列化耗時:0ms; User: User [userId=null, userName=張三, passWord=123456, userInfo=張三是一個很牛逼的人, friends=[User [userId=null, userName=李四, passWord=123456, userInfo=李四是一個很牛逼的人, friends=null], User [userId=null, userName=王五, passWord=123456, userInfo=王五是一個很牛逼的人, friends=null]]]

5、總結

我們通過Main方法來進行對比測試,(但是通過測試發現少量數據無法準確顯示每種序列化方式的優劣,故這里無法給出比較好的答案,僅供參考)。示例代碼如下所示:

package serialize;import java.io.IOException;/** * @author liqqc */public class Main { public static void main(String[] args) throws IOException, ClassNotFoundException { ProtoBuffSerialize protoBuffSerialize = new ProtoBuffSerialize(); protoBuffSerialize.start(); System.err.println(); System.err.println(); JavaSerialize javaSerialize = new JavaSerialize(); javaSerialize.start(); System.err.println(); JsonSerialize jsonSerialize = new JsonSerialize(); jsonSerialize.start(); System.err.println(); FastJsonSerialize fastJsonSerialize = new FastJsonSerialize(); fastJsonSerialize.start(); }}

運行結果:

jprotobuf序列化耗時:7ms; 總大小:148jprotobuf反序列化耗時:0ms

java serialize: 6ms; 總大小:420java deserialize: 1ms

json serialize: 37ms; 總大小:341json deserialize: 27ms

fastJson serialize: 173ms; 總大小:269fastJson serialize: 35ms

上面的測試僅供參考,并不能代表通過大量數據進行測試的結果。可以發現:序列化后對象的所占大小上:protobuff序列化所占總大小是最少的;其次是fastJson序列化;最后是json序列化和java原生序列化。對于序列化耗時,上面的測試不準。

還是去看看專業測試分析吧,具體情況可以進去看看https://github.com/eishay/jvm-serializers/wiki

本文僅僅簡單介紹了下幾種序列化方式的實現,并未經過大量測試對其進行對比分析,待后續有時間和精力在進行補充。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲欧洲美洲国产香蕉| 欧美精品不卡| 欧美丝袜一区| 九九综合在线| 亚洲v天堂v手机在线| 亚洲青青久久| 久久99久久久精品欧美| 红杏一区二区三区| 99精品一区| 久久亚洲欧美| 国产日韩免费| 桃色av一区二区| 黄色精品网站| 日韩激情中文字幕| 老司机精品视频在线播放| 亚洲播播91| 亚洲三级av| 黑人精品一区| 日韩中文字幕麻豆| 欧美激情福利| 久久免费黄色| 蜜臀av国产精品久久久久| 国产精品va| 九九久久婷婷| 国产精品最新| 亚洲美洲欧洲综合国产一区| 91精品国产自产精品男人的天堂| 成人污污视频| 久久福利一区| 精品视频99| 美女被久久久| 日本一二区不卡| 久热综合在线亚洲精品| 麻豆免费精品视频| 亚洲欧美日韩国产一区| 国产日韩在线观看视频| 色婷婷精品视频| 日韩精品免费视频一区二区三区| 美女av在线免费看| 天堂精品久久久久| 亚洲性图久久| 久久av影院| 综合国产在线| 蜜桃av.网站在线观看| 综合激情婷婷| 久久伦理在线| 六月丁香综合在线视频| 男人的天堂久久精品| 久久香蕉网站| 日本在线成人| 欧美中文字幕一区二区| 国产高潮在线| 欧美亚洲三区| 免费观看在线色综合| 亚洲最新无码中文字幕久久| 日韩一区二区三区高清在线观看| 亚洲v在线看| 精品日本视频| 国产欧美日韩影院| 亚洲香蕉久久| 快she精品国产999| 欧美日中文字幕| 日韩成人精品一区二区| 久久黄色影视| 少妇精品在线| 亚洲尤物在线| 久久网站免费观看| 中文字幕在线看片| 久久精品福利| 国产日韩欧美一区二区三区 | 99久久婷婷| 久久精品国产一区二区| 欧美日韩一区自拍| 亚洲开心激情| 久久亚洲精品伦理| 国产亚洲精品v| 国产精品99免费看| 日韩在线二区| 四虎成人av| 精品国产亚洲一区二区在线观看| 欧美精品国产白浆久久久久| 蜜臀久久99精品久久久久宅男| 在线成人直播| 91精品二区| 伊人久久亚洲热| 欧美午夜精彩| 亚洲精品a级片| 婷婷综合激情| 91久久在线| 亚洲一区欧美激情| 亚洲色图国产| 免播放器亚洲| 在线精品福利| 日韩有吗在线观看| 日韩精品欧美成人高清一区二区| 日韩欧美中文字幕一区二区三区| 亚洲精品少妇| 欧美日韩午夜电影网| 国产精一区二区| 麻豆精品99| www.九色在线| 1000部精品久久久久久久久| 国产99精品| 在线综合视频| 蜜臀av一区二区三区| 日本国产欧美| 国产日产精品_国产精品毛片| 久久国产日韩欧美精品| 国产精品视频一区二区三区综合| 国产极品嫩模在线观看91精品| 美女精品视频在线| 欧美日韩视频网站| 亚洲国产日韩欧美在线| 麻豆91精品| 国产精品一区二区三区av| 国产一区2区| 国产一区清纯| 99视频精品全国免费| 美女日韩在线中文字幕| 欧美一区二区三区久久| 精品国产黄a∨片高清在线| 国产精品国产一区| 久久蜜桃资源一区二区老牛| 免费在线观看成人| 久久超级碰碰| 久久久精品五月天| 亚洲狼人精品一区二区三区| 国产精品1luya在线播放| 久久久精品日韩| 色综合视频一区二区三区日韩| 国产精品色在线网站| 久久九九电影| 日韩一区精品视频| 精品日韩一区| 国产精品女主播一区二区三区| 日韩和欧美一区二区三区| 欧美精品aa| 国产一区欧美| 国产精品白丝久久av网站| 国产伊人精品| 国产精品a级| 国产日韩综合| 精品国产一区二区三区噜噜噜| 亚洲韩日在线| 国产精品亲子伦av一区二区三区| 久久久9色精品国产一区二区三区| 蜜臀91精品一区二区三区| 美女高潮久久久| 久热精品在线| 伊人久久国产| 蜜桃久久久久久久| 国际精品欧美精品| 爽爽淫人综合网网站| 国产69精品久久| 亚洲人妖在线| 亚洲高清不卡| 精品精品99| 日韩高清二区| 国内精品福利| 国产aⅴ精品一区二区四区| 亚洲91网站| 免费av一区| 成人午夜网址| 国产日韩中文在线中文字幕| 一区在线免费| 最近高清中文在线字幕在线观看1| 免播放器亚洲一区| 99久久99久久精品国产片果冰| 国产三级精品三级在线观看国产| 欧美日韩国产免费观看视频| 国产精品久久国产愉拍| 久久亚洲美女| 亚洲大全视频| 成人片免费看| 韩国一区二区三区视频| 欧美在线看片| 亚洲天堂av资源在线观看| 久久久亚洲一区| 国产在线观看www| 国产精品夜夜夜| 日韩综合一区二区| 精品欧美激情在线观看| 欧美激情国产在线| 欧美国产另类| 国产乱人伦精品一区| 色综合视频一区二区三区日韩 | 日韩三区四区| 免费国产亚洲视频| 日韩视频在线一区二区三区 | 亚洲国产日韩欧美在线| 日韩欧美午夜| 首页国产精品| yellow在线观看网址| 欧美黑人巨大videos精品| 欧美偷窥清纯综合图区| 亚洲精品观看| 日韩精品高清不卡| 亚洲精品精选| 日韩精品视频在线看| 亚洲a成人v|