电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java序列化常見(jiàn)實(shí)現(xiàn)方法代碼實(shí)例

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

0、前言

本文主要對(duì)幾種常見(jiàn)Java序列化方式進(jìn)行實(shí)現(xiàn)。包括Java原生以流的方法進(jìn)行的序列化、Json序列化、FastJson序列化、Protobuff序列化。

1、Java原生序列化

Java原生序列化方法即通過(guò)Java原生流(InputStream和OutputStream之間的轉(zhuǎn)化)的方式進(jìn)行轉(zhuǎn)化。需要注意的是JavaBean實(shí)體類必須實(shí)現(xiàn)Serializable接口,否則無(wú)法序列化。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('張三是一個(gè)很牛逼的人'); u.setFriends(friends); User f1 = new User(); f1.setUserName('李四'); f1.setPassWord('123456'); f1.setUserInfo('李四是一個(gè)很牛逼的人'); User f2 = new User(); f2.setUserName('王五'); f2.setPassWord('123456'); f2.setUserInfo('王五是一個(gè)很牛逼的人'); 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); }}

運(yùn)行結(jié)果:

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

2、Json序列化

Json序列化一般會(huì)使用jackson包,通過(guò)ObjectMapper類來(lái)進(jìn)行一些操作,比如將對(duì)象轉(zhuǎn)化為byte數(shù)組或者將json串轉(zhuǎn)化為對(duì)象。現(xiàn)在的大多數(shù)公司都將json作為服務(wù)器端返回的數(shù)據(jù)格式。比如調(diào)用一個(gè)服務(wù)器接口,通常的請(qǐng)求為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('張三是一個(gè)很牛逼的人'); u.setFriends(friends); User f1 = new User(); f1.setUserName('李四'); f1.setPassWord('123456'); f1.setUserInfo('李四是一個(gè)很牛逼的人'); User f2 = new User(); f2.setUserName('王五'); f2.setPassWord('123456'); f2.setUserInfo('王五是一個(gè)很牛逼的人'); 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); }}

運(yùn)行結(jié)果:

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

3、FastJson序列化

fastjson 是由阿里巴巴開(kāi)發(fā)的一個(gè)性能很好的Java 語(yǔ)言實(shí)現(xiàn)的 Json解析器和生成器。特點(diǎn):速度快,測(cè)試表明fastjson具有極快的性能,超越任其他的java json parser。功能強(qiáng)大,完全支持java bean、集合、Map、日期、Enum,支持范型和自省。無(wú)依賴,能夠直接運(yùn)行在Java SE 5.0以上版本

支持Android。使用時(shí)候需引入FastJson第三方j(luò)ar包。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('張三是一個(gè)很牛逼的人'); u.setFriends(friends); User f1 = new User(); f1.setUserName('李四'); f1.setPassWord('123456'); f1.setUserInfo('李四是一個(gè)很牛逼的人'); User f2 = new User(); f2.setUserName('王五'); f2.setPassWord('123456'); f2.setUserInfo('王五是一個(gè)很牛逼的人'); 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); }}

運(yùn)行結(jié)果:

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

4、ProtoBuff序列化

ProtocolBuffer是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式,可以用于結(jié)構(gòu)化數(shù)據(jù)序列化。適合做數(shù)據(jù)存儲(chǔ)或 RPC 數(shù)據(jù)交換格式。可用于通訊協(xié)議、數(shù)據(jù)存儲(chǔ)等領(lǐng)域的語(yǔ)言無(wú)關(guān)、平臺(tái)無(wú)關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)格式。

優(yōu)點(diǎn):跨語(yǔ)言;序列化后數(shù)據(jù)占用空間比JSON小,JSON有一定的格式,在數(shù)據(jù)量上還有可以壓縮的空間。

缺點(diǎn):它以二進(jìn)制的方式存儲(chǔ),無(wú)法直接讀取編輯,除非你有 .proto 定義,否則無(wú)法直接讀出 Protobuffer的任何內(nèi)容。

其與thrift的對(duì)比:兩者語(yǔ)法類似,都支持版本向后兼容和向前兼容,thrift側(cè)重點(diǎn)是構(gòu)建跨語(yǔ)言的可伸縮的服務(wù),支持的語(yǔ)言多,同時(shí)提供了全套R(shí)PC解決方案,可以很方便的直接構(gòu)建服務(wù),不需要做太多其他的工作。 Protobuffer主要是一種序列化機(jī)制,在數(shù)據(jù)序列化上進(jìn)行性能比較,Protobuffer相對(duì)較好。

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

一個(gè)帶有jprotobuf注解的JavaBean如下所示,如果你想深入學(xué)習(xí)可以參照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('張三是一個(gè)很牛逼的人'); u2.setFriends(friends); User f1 = new User(); f1.setUserName('李四'); f1.setPassWord('123456'); f1.setUserInfo('李四是一個(gè)很牛逼的人'); User f2 = new User(); f2.setUserName('王五'); f2.setPassWord('123456'); f2.setUserInfo('王五是一個(gè)很牛逼的人'); 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序列化耗時(shí):' + (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反序列化耗時(shí):'+ (etime_jpb_decode-stime_jpb_decode) + 'ms; User: ' + user); }}

運(yùn)行結(jié)果:

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

5、總結(jié)

我們通過(guò)Main方法來(lái)進(jìn)行對(duì)比測(cè)試,(但是通過(guò)測(cè)試發(fā)現(xiàn)少量數(shù)據(jù)無(wú)法準(zhǔn)確顯示每種序列化方式的優(yōu)劣,故這里無(wú)法給出比較好的答案,僅供參考)。示例代碼如下所示:

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(); }}

運(yùn)行結(jié)果:

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

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

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

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

上面的測(cè)試僅供參考,并不能代表通過(guò)大量數(shù)據(jù)進(jìn)行測(cè)試的結(jié)果。可以發(fā)現(xiàn):序列化后對(duì)象的所占大小上:protobuff序列化所占總大小是最少的;其次是fastJson序列化;最后是json序列化和java原生序列化。對(duì)于序列化耗時(shí),上面的測(cè)試不準(zhǔn)。

還是去看看專業(yè)測(cè)試分析吧,具體情況可以進(jìn)去看看https://github.com/eishay/jvm-serializers/wiki

本文僅僅簡(jiǎn)單介紹了下幾種序列化方式的實(shí)現(xiàn),并未經(jīng)過(guò)大量測(cè)試對(duì)其進(jìn)行對(duì)比分析,待后續(xù)有時(shí)間和精力在進(jìn)行補(bǔ)充。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 继电器模组-IO端子台-plc连接线-省配线模组厂家-世麦德 | 全自动过滤器_反冲洗过滤器_自清洗过滤器_量子除垢环_量子环除垢_量子除垢 - 安士睿(北京)过滤设备有限公司 | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 中医中药治疗血小板减少-石家庄血液病肿瘤门诊部| 旗杆生产厂家_不锈钢锥形旗杆价格_铝合金电动旗杆-上海锥升金属科技有限公司 | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 不锈钢搅拌罐_高速搅拌罐厂家-无锡市凡格德化工装备科技有限公司 | 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 杭州代理记账多少钱-注册公司代办-公司注销流程及费用-杭州福道财务管理咨询有限公司 | 服务器之家 - 专注于服务器技术及软件下载分享 | 柴油机_柴油发电机_厂家_品牌-江苏卡得城仕发动机有限公司 | 施工围挡-施工PVC围挡-工程围挡-深圳市旭东钢构技术开发有限公司 | 金属软管_不锈钢金属软管_巩义市润达管道设备制造有限公司 | 世界箱包品牌十大排名,女包小众轻奢品牌推荐200元左右,男包十大奢侈品牌排行榜双肩,学生拉杆箱什么品牌好质量好 - Gouwu3.com | 双效节能浓缩器-热回流提取浓缩机组-温州市利宏机械 | 杭州代理记账费用-公司注销需要多久-公司变更监事_杭州福道财务管理咨询有限公司 | 武汉高低温试验机-现货恒温恒湿试验箱-高低温湿热交变箱价格-湖北高天试验设备 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 | 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 | 水质监测站_水质在线分析仪_水质自动监测系统_多参数水质在线监测仪_水质传感器-山东万象环境科技有限公司 | 智能门锁电机_智能门锁离合器_智能门锁电机厂家-温州劲力智能科技有限公司 | J.S.Bach 圣巴赫_高端背景音乐系统_官网 | 非小号行情 - 专业的区块链、数字藏品行情APP、金色财经官网 | 排烟防火阀-消防排烟风机-正压送风口-厂家-价格-哪家好-德州鑫港旺通风设备有限公司 | 专注氟塑料泵_衬氟泵_磁力泵_卧龙泵阀_化工泵专业品牌 - 梭川泵阀 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 螺旋绞龙叶片,螺旋输送机厂家,山东螺旋输送机-淄博长江机械制造有限公司 | 诸城网站建设-网络推广-网站优化-阿里巴巴托管-诸城恒泰互联 | 智慧消防-消防物联网系统云平台| 胶辊硫化罐_胶鞋硫化罐_硫化罐厂家-山东鑫泰鑫智能装备有限公司 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 锯边机,自动锯边机,双面涂胶机-建业顺达机械有限公司 | 奶茶加盟,奶茶加盟店连锁品牌-甜啦啦官网 | 福州甲醛检测-福建室内空气检测_环境检测_水质检测-福建中凯检测技术有限公司 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 双效节能浓缩器-热回流提取浓缩机组-温州市利宏机械 | 磁力抛光机_磁力研磨机_磁力去毛刺机-冠古设备厂家|维修|租赁【官网】 | 专业广州网站建设,微信小程序开发,一物一码和NFC应用开发、物联网、外贸商城、定制系统和APP开发【致茂网络】 | 电子厂招聘_工厂招聘_普工招聘_小时工招聘信息平台-众立方招工网 | 升降机-高空作业车租赁-蜘蛛车-曲臂式伸缩臂剪叉式液压升降平台-脚手架-【普雷斯特公司厂家】 | 德国UST优斯特氢气检漏仪-德国舒赐乙烷检测仪-北京泽钏 |