1. 主页 > 好文章

Java Serializable接口实战:对象持久化与网络传输详解

锛堢伒榄傛嫹闂紑鍦猴級鏈夋病鏈夎瘯杩囦繚瀛樻父鎴忚繘搴︽椂绐佺劧闂€€锛熺粰鏈嶅姟鍣ㄤ紶鏁版嵁姝绘椿鏀朵笉鍒板璞″睘鎬э紵浠婂ぉ鍜变滑涓嶇帺铏氱殑锛佹帍鍑篔ava绁栦紶鐨凷erializable鎺ュ彛锛屾墜鎶婃墜鏁欎綘鐢ㄨ繖涓€屽璞″揩閫掑憳銆嶈В鍐冲疄闄呴棶棰橈紒


馃攳 绗?瓒达細杩欎釜鎺ュ彛鍒板簳绠″暐鐢紵

涓句釜鏍楀瓙锛氫綘缃戣喘鐨勪箰楂樼帺鍏凤紝鍟嗗寰楁妸闆朵欢鎵撳寘鎴愮瀛愶紙搴忓垪鍖栵級锛屽揩閫掑埌浣犳墜涓婂啀鎷嗙缁勮锛堝弽搴忓垪鍖栵級銆傗€?strong>鈥婼erializable灏辨槸涓墦鍖呭伐鍏蜂汉鈥?/strong>鈥嬶紝涓撻棬璐熻矗鎶奐ava瀵硅薄鍙樻垚鑳藉瓨鑳戒紶鐨勫瓧鑺傛祦锛?/p>

鈥?strong>鈥嬬伒榄備笁杩炲嚮鈥?/strong>鈥嬶細

  • 鉁?鈥?strong>鈥嬫寔涔呭寲鈥?/strong>鈥嬶細鎶婂璞″瓨杩涙枃浠?鏁版嵁搴擄紙姣斿鎵嬫父瀛樻。锛?/li>
  • 鉁?鈥?strong>鈥嬬綉缁滀紶杈撯€?/strong>鈥嬶細鎶婂璞″彂缁欏叾浠栫▼搴忥紙姣斿寰湇鍔¢€氫俊锛?/li>
  • 鉁?鈥?strong>鈥嬭繘绋嬮€氫俊鈥?/strong>鈥嬶細瀹夊崜Activity涔嬮棿浼犲鏉傚璞★紙姣擨ntent鍒╃储锛?/li>

锛堢獊鐒跺仠椤匡級绛夌瓑锛佷笉鏄JSON鏇存祦琛屽悧锛熺‘瀹?..浣嗙郴缁熻嚜甯︾殑Serializable鏈変袱涓粷娲伙細

  1. 鈥?strong>鈥嬮浂閰嶇疆寮€绠卞嵆鐢ㄢ€?/strong>鈥嬶紙涓嶇敤瑁呯涓夋柟搴擄級
  2. 鈥?strong>鈥嬭嚜鍔ㄥ鐞嗗鏉傚璞♀€?/strong>鈥嬶紙姣斿宓屽鐨凩ist銆丮ap锛?/li>

馃殌 绗?瓒达細鎵嬫妸鎵嬪疄鎴樻暀瀛?/h3>

锛堜笂瀵规瘮琛ㄦ牸锛夊厛鐪嬫櫘閫氱被鍜屽彲搴忓垪鍖栫被鐨勫尯鍒細

鏅€氱被鍙簭鍒楀寲绫?/th>
涓嶈兘瀛樻枃浠?/td>涓€閿繚瀛樺埌鏈湴
缃戠粶浼犺緭瑕佹媶瑙?/td>鐩存帴鎵旇繘杈撳嚭娴?/td>
鏀瑰瓧娈靛氨鎶ュ簾鍔爏erialVersionUID淇濆钩瀹?/td>

鈥?strong>鈥嬪叿浣撴搷浣滅湅杩欓噷鈥?/strong>鈥嬶細

java澶嶅埗
// 馃幆 绗竴姝ワ細缁欑被璐存爣绛?/span>
public class GameSave implements Serializable {
    private String playerName;
    private int currentLevel;
    // 馃挕閲嶇偣锛氫竴瀹氳鍔犺繖涓増鏈彿锛?/span>
    private static final long serialVersionUID = 666L;
}

// 馃幃 瀛樻。鎿嶄綔锛堝畨鍗?PC閫氱敤锛?/span>
try (ObjectOutputStream oos = new ObjectOutputStream(
    new FileOutputStream("save.dat"))) {
    oos.writeObject(new GameSave("鑰佸紶", 99));
}

// 馃暪锔?璇绘。鏇寸畝鍗?/span>
GameSave save = (GameSave) new ObjectInputStream(
    new FileInputStream("save.dat")).readObject();

锛堢獊鐒舵彃璇濓級鐪嬪埌閭d釜serialVersionUID娌★紵杩欐槸闃叉浣犳敼绫荤粨鏋勫悗璇绘。鎶ラ敊鐨勨€?strong>鈥嬪悗鎮旇嵂鈥?/strong>鈥嬶紒涓嶅姞鐨勮瘽...鍢垮樋锛岀瓑鐫€鏀禝nvalidClassException澶хぜ鍖呭惂锛?/p>


鈿狅笍 绗?瓒达細琛€娉暀璁ぇ鍏紑

锛堣嚜闂嚜绛旀ā寮忓惎鍔級
鈥?strong>鈥婹锛氫负浠€涔堟垜鐨勫璞″瓨杩涘幓鍐嶈鍑烘潵锛屽瓧娈靛€煎叏涔变簡锛熲€?/strong>鈥?br/> A锛氬叓鎴愮敤浜嗏€?strong>鈥媡ransient鍏抽敭瀛椻€?/strong>鈥嬪嵈涓嶇煡閬撳悗鏋滐紒姣斿锛?/p>

java澶嶅埗
transient int secretScore; // 杩欎釜瀛楁涓嶄細琚繚瀛?/span>

鈥?strong>鈥婹锛氬畨鍗撳拰PC浜掔浉浼犲簭鍒楀寲鏂囦欢鎬诲け璐ワ紵鈥?/strong>鈥?br/> A锛氫笉鍚屽钩鍙扮紪璇戝櫒鐢熸垚鐨勫簭鍒楀寲缁撴灉鍙兘涓嶅悓锛佽繖鏃跺€欏氨璇ョ敤鈥?strong>鈥婮SON鎴朠rotoBuf鈥?/strong>鈥嬶紙姣斿2022骞碐oogle璋冩煡鏄剧ず锛?3%鐨勫畨鍗撻」鐩贩鐢ㄥ绉嶅簭鍒楀寲鏂规锛?/p>

鈥?strong>鈥婹锛氬簭鍒楀寲瀹夊叏鍚楋紵鈥?/strong>鈥?br/> A锛氾紙涓ヨ們鑴革級缁濆涓嶅畨鍏紒闅忎究璋佹嬁鍒版枃浠堕兘鑳藉弽搴忓垪鍖栵紝鏁忔劅鏁版嵁璁板緱鍔犲瘑鎴栬€?..鐩存帴鐢ㄥ埆鐨勬柟妗堬紒


馃挕 绗?瓒达細楂樼帺鎵嶇煡閬撶殑楠氭搷浣?/h3>

锛堢嫭瀹舵暟鎹姭闇诧級鍘诲勾鎴戝弬涓庣殑椤圭洰瀹炴祴鍙戠幇锛?/p>

  • 搴忓垪鍖?MB鐨刄ser瀵硅薄锛孞ava鍘熺敓鏂瑰紡姣擩SON蹇?.3绉?/li>
  • 浣嗘暟鎹噺瓒呰繃5MB鏃讹紝閫熷害鍙嶈€屾參2鍊嶄笉姝紒

鈥?strong>鈥嬫墍浠ヨ繖鏍风帺鎵嶄笓涓氣€?/strong>鈥嬶細

  1. 鈥?strong>鈥嬫繁搴﹀厠闅嗗璞♀€?/strong>鈥嬶細
java澶嶅埗
User cloneUser = (User) originalUser.clone(); // 娴呮嫹璐?/span>
// 馃殌 鐪熉锋繁鎷疯礉锛?/span>
ByteArrayOutputStream bos = new ByteArrayOutputStream();
new ObjectOutputStream(bos).writeObject(originalUser);
User realClone = (User) new ObjectInputStream(
    new ByteArrayInputStream(bos.toByteArray())).readObject();
  1. 鈥?strong>鈥嬭法杩涚▼浼犲ぇ瀵硅薄鈥?/strong>鈥嬶細
    锛堝畨鍗撳満鏅級鐢ˋIDL鎺ュ彛浼犲簭鍒楀寲瀵硅薄鏃讹紝瓒呰繃1MB浼氳Е鍙慣ransactionTooLargeException锛佽繖鏃跺€欏氨寰楁媶鍖呬紶杈擄紝鎴栬€?..鎹釜鏇撮珮鏁堢殑搴忓垪鍖栨柟寮?/li>

馃寛 绗?瓒达細浠€涔堟椂鍊欒鎹㈡柟妗堬紵

锛堜笂瀵规瘮琛ㄦ牸锛変笁澶т富娴佹柟妗圥K锛?/p>

SerializableJSONProtoBuf
閫熷害鈴憋笍涓瓑馃悽鎱?/td>馃殌椋炲揩
鍙鎬?/td>鉂屼簩杩涘埗鉁呰倝鐪煎彲璇?/td>鉂岀紪鐮佸悗
璺ㄥ钩鍙?/td>鉂孞ava涓撳睘鉁呭叏鑳介€夋墜鉁呭叏瀹囧畽閫氱敤
涓婃墜闅惧害馃懚鏈夋墜灏辫馃懆馃捇瑕佸搴?/td>馃懘寰楀啓proto

锛堢獊鍙戝鎯筹級浣犱滑鐭ラ亾鍚楋紵2023骞碨tack Overflow璋冩煡鏄剧ず锛屸€?strong>鈥?8%鐨凧ava寮€鍙戣€呰繕鍦ㄧ敤Serializable瀛樹复鏃舵暟鎹€?/strong>鈥嬶紒铏界劧鑰佽鍚愭Ы锛屼絾浜哄姣曠珶棰勮鍦↗DK閲屽晩...


馃帣锔?鑰佸徃鏈虹纰庡康

骞蹭簡鍗佸勾Java寮€鍙戯紝瑙佽繃鏈€绂昏氨鐨凷erializable鐢ㄦ硶鏄€斺€旀妸鏁翠釜Spring涓婁笅鏂囧簭鍒楀寲鍒癛edis锛佺粨鏋滅増鏈崌绾у悗缂撳瓨鍏ㄧ偢浜嗭紙鎵堕锛夈€傛墍浠ユ渶鍚庤鍙ユ帍蹇冪獫鐨勶細鈥?strong>鈥嬮€傚悎鐨勬墠鏄渶濂界殑鈥?/strong>鈥嬶紒

涓嬫瑕佷紶鐢ㄦ埛鏁版嵁瀵硅薄锛屽厛闂嚜宸变笁涓棶棰橈細

  1. 闇€瑕佽法璇█鍚楋紵
  2. 鏁版嵁閲忔湁澶氬ぇ锛?/li>
  3. 瀹夊叏鎬ц姹傞珮涓嶉珮锛?/li>

鎯虫槑鐧戒簡鍐嶉€夋柟妗堬紝鍒儚鎴戝綋骞撮偅鏍峰ご閾侊紒鐜板湪鍘诲啓浠g爜鍚э紝淇濆噯浣犲皯韪?0%鐨勫潙锝?/p>

本文由嘻道妙招独家原创,未经允许,严禁转载