Java序列化流的奇妙之旅

Java序列化流有何奇妙之处呢?通过一个个案例逐一感受序列化流。

!!!好戏在后头!!!

1.IO流读写文件

先从一个普通文件读写字符串开始讲起。

例子:输出字符串到文件,再从文件中读取字符串

Java序列化流的奇妙之旅

在某一天 灵感迸发:我可以把Java程序中的 对象信息直接保存到普通的 txt 文件中吗?并且当我想使用它时,还可以拿出来就可以直接用,不需要再做其他处理,就像存储普通的字符串一样,在文件中读出来就可以直接使用的那种。

2.序列化和反序列化流奇妙之处

要想实现对象信息存储到普通文件不被破化,并且读取出来不需要再做其他处理既可以像使用普通new出来的对象一样直接使用的效果,必须有一种 特殊的IO流来完成,于是诞生了 序列化流和反序列化流

2.1.案例一:把普通文件当作对象存储库来使用

详细的描述:将一个list 集合保存到普通文件,再读出来直接使用,实现list集合数据的增删改查

Person 类

//&#xA0;&#x5E8F;&#x5217;&#x5316;&#x5BF9;&#x8C61;&#x4FE1;&#x606F;&#xFF1A;&#x5FC5;&#x987B;&#x5B9E;&#x73B0;&#x5E8F;&#x5217;&#x5316;&#x6807;&#x8BB0;&#x63A5;&#x53E3;Serializable<br>public&#xA0;class&#xA0;Person&#xA0;implements&#xA0;Serializable&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;//&#xA0;&#x5E8F;&#x5217;&#x5316;&#x7248;&#x672C;UID<br>&#xA0;&#xA0;&#xA0;&#xA0;private&#xA0;static&#xA0;final&#xA0;long&#xA0;serialVersionUID&#xA0;=&#xA0;1L;<br>&#xA0;&#xA0;&#xA0;&#xA0;private&#xA0;String&#xA0;name;<br>&#xA0;&#xA0;&#xA0;&#xA0;private&#xA0;int&#xA0;age;<br>&#xA0;&#xA0;&#xA0;&#xA0;private&#xA0;String&#xA0;sex;<br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;String&#xA0;<span class="hljs-function"><span class="hljs-title">getName</span></span>()&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-built_in">return</span>&#xA0;name;<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;void&#xA0;setName(String&#xA0;name)&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;this.name&#xA0;=&#xA0;name;<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;int&#xA0;<span class="hljs-function"><span class="hljs-title">getAge</span></span>()&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-built_in">return</span>&#xA0;age;<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;void&#xA0;setAge(int&#xA0;age)&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;this.age&#xA0;=&#xA0;age;<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;String&#xA0;<span class="hljs-function"><span class="hljs-title">getSex</span></span>()&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-built_in">return</span>&#xA0;sex;<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;void&#xA0;setSex(String&#xA0;sex)&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;this.sex&#xA0;=&#xA0;sex;<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br><br>&#xA0;&#xA0;&#xA0;&#xA0;@Override<br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;String&#xA0;<span class="hljs-function"><span class="hljs-title">toString</span></span>()&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-built_in">return</span>&#xA0;<span class="hljs-string">"Person{"</span>&#xA0;+&#xA0;<span class="hljs-string">"name='"</span>&#xA0;+&#xA0;name&#xA0;+&#xA0;<span class="hljs-string">",&#xA0;age="</span>&#xA0;+&#xA0;age&#xA0;+&#xA0;<span class="hljs-string">",&#xA0;sex='"</span>&#xA0;+&#xA0;sex&#xA0;+&#xA0;<span class="hljs-string">'}'</span>;<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;<span class="hljs-function"><span class="hljs-title">Person</span></span>()&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;Person(String&#xA0;name,&#xA0;Integer&#xA0;age,&#xA0;String&#xA0;sex)&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;this.name&#xA0;=&#xA0;name;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;this.age&#xA0;=&#xA0;age;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;this.sex&#xA0;=&#xA0;sex;<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br>}

序列化和反序列化

public&#xA0;class&#xA0;Demo2&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;static&#xA0;void&#xA0;main(String[]&#xA0;args)&#xA0;throws&#xA0;IOException,&#xA0;ClassNotFoundException&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#x6570;&#x636E;&#x51C6;&#x5907;&#xFF1A;&#x96C6;&#x5408;&#x7C7B;&#x90FD;&#x5B9E;&#x73B0;&#x4E86;&#x5E8F;&#x5217;&#x5316;&#x63A5;&#x53E3;Serializable<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;List<person>&#xA0;list&#xA0;=&#xA0;new&#xA0;ArrayList<>();<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;list.add(new&#xA0;Person(<span class="hljs-string">"&#x5F20;&#x4E09;"</span>,38,<span class="hljs-string">"&#x7537;"</span>));<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;list.add(new&#xA0;Person(<span class="hljs-string">"&#x674E;&#x56DB;"</span>,38,<span class="hljs-string">"&#x7537;"</span>));<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;list.add(new&#xA0;Person(<span class="hljs-string">"&#x5982;&#x82B1;"</span>,18,<span class="hljs-string">"&#x5973;"</span>));<br><br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#xA0;&#x5E8F;&#x5217;&#x5316;&#x4FDD;&#x5B58;&#x5230;&#x666E;&#x901A;&#x6587;&#x4EF6;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;File&#xA0;file&#xA0;=&#xA0;new&#xA0;File(<span class="hljs-string">"D:/demo2.txt"</span>);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;ObjectOutputStream&#xA0;objectOutputStream&#xA0;=&#xA0;new&#xA0;ObjectOutputStream(new&#xA0;FileOutputStream(file));<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;objectOutputStream.writeObject(list);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;objectOutputStream.close();<br><br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#xA0;&#x8BFB;&#x53D6;&#x666E;&#x901A;&#x6587;&#x4EF6;&#x53CD;&#x5E8F;&#x5217;&#x5316;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;ObjectInputStream&#xA0;objectInputStream&#xA0;=&#xA0;new&#xA0;ObjectInputStream(new&#xA0;FileInputStream(file));<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;List<person>&#xA0;personList&#xA0;=&#xA0;(List<person>)&#xA0;objectInputStream.readObject();<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;objectInputStream.close();<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">for</span>&#xA0;(Person&#xA0;person:personList){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;System.out.println(person);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br>}<br></person></person></person>

执行结果:

Java序列化流的奇妙之旅

序列化保存到普通文件的数据:

Java序列化流的奇妙之旅

虽然没人会考虑使用这种方式来保存数据,但这对于理解序列化流有很大的帮助。

2.2.案例二:任意元素类型的List 集合序列化读写

**<br>&#xA0;*&#xA0;&#x4EFB;&#x610F;&#x5143;&#x7D20;&#x7C7B;&#x578B;&#x7684;List&#xA0;&#x96C6;&#x5408;&#x7684;&#x5BF9;&#x8C61;&#x5B58;&#x50A8;&#x5230;&#x666E;&#x901A;&#x6587;&#x4EF6;&#xFF0C;&#x8BFB;&#x53D6;&#x76F4;&#x63A5;&#x4F7F;&#x7528;<br>&#xA0;*&#xA0;@param&#xA0;<t><br>&#xA0;*/<br>public&#xA0;class&#xA0;ObjectList<t extends list>&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;//&#xA0;&#x5E8F;&#x5217;&#x5316;&#x4FDD;&#x5B58;&#x5230;&#x666E;&#x901A;&#x6587;&#x4EF6;<br>&#xA0;&#xA0;&#xA0;&#xA0;private&#xA0;File&#xA0;file&#xA0;=&#xA0;new&#xA0;File(<span class="hljs-string">"D:/demoList.txt"</span>);<br><br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;void&#xA0;writerList(T&#xA0;t)&#xA0;throws&#xA0;IOException&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;ObjectOutputStream&#xA0;objectOutputStream&#xA0;=&#xA0;new&#xA0;ObjectOutputStream(new&#xA0;FileOutputStream(file));<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;objectOutputStream.writeObject(t);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;objectOutputStream.close();<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br><br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;T&#xA0;readList()&#xA0;throws&#xA0;IOException,&#xA0;ClassNotFoundException&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#xA0;&#x8BFB;&#x53D6;&#x666E;&#x901A;&#x6587;&#x4EF6;&#x53CD;&#x5E8F;&#x5217;&#x5316;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;ObjectInputStream&#xA0;objectInputStream&#xA0;=&#xA0;new&#xA0;ObjectInputStream(new&#xA0;FileInputStream(file));<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;T&#xA0;t&#xA0;=&#xA0;(T)&#xA0;objectInputStream.readObject();<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;objectInputStream.close();<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-built_in">return</span>&#xA0;t;<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br><br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;boolean&#xA0;<span class="hljs-function"><span class="hljs-title">isExists</span></span>(){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-built_in">return</span>&#xA0;file.exists();<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;boolean&#xA0;<span class="hljs-function"><span class="hljs-title">delete</span></span>(){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-built_in">return</span>&#xA0;file.delete();<br>&#xA0;&#xA0;&#xA0;&#xA0;}<br><br>&#xA0;&#xA0;&#xA0;&#xA0;//&#xA0;&#x6D4B;&#x8BD5;<br>&#xA0;&#xA0;&#xA0;&#xA0;public&#xA0;static&#xA0;void&#xA0;main(String[]&#xA0;args)&#xA0;throws&#xA0;IOException,&#xA0;ClassNotFoundException&#xA0;{<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;ObjectList<list<person>>&#xA0;objectList&#xA0;=&#xA0;new&#xA0;ObjectList<>();<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#x6570;&#x636E;&#x51C6;&#x5907;&#xFF1A;&#x96C6;&#x5408;&#x7C7B;&#x90FD;&#x5B9E;&#x73B0;&#x4E86;&#x5E8F;&#x5217;&#x5316;&#x63A5;&#x53E3;Serializable<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;List<person>&#xA0;list&#xA0;=&#xA0;new&#xA0;ArrayList<>();<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;list.add(new&#xA0;Person(<span class="hljs-string">"&#x5F20;&#x4E09;"</span>,38,<span class="hljs-string">"&#x7537;"</span>));<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;list.add(new&#xA0;Person(<span class="hljs-string">"&#x674E;&#x56DB;"</span>,38,<span class="hljs-string">"&#x7537;"</span>));<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;list.add(new&#xA0;Person(<span class="hljs-string">"&#x5982;&#x82B1;"</span>,18,<span class="hljs-string">"&#x5973;"</span>));<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#xA0;&#x6301;&#x4E45;&#x5316;&#x5BF9;&#x8C61;&#x6570;&#x636E;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;objectList.writerList(list);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#xA0;&#x67E5;&#x8BE2;&#x6301;&#x4E45;&#x5316;&#x5BF9;&#x8C61;&#x6570;&#x636E;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;List<person>&#xA0;personList&#xA0;=&#xA0;objectList.readList();<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;System.out.println(<span class="hljs-string">"&#x904D;&#x5386;&#x6301;&#x4E45;&#x5316;&#x5BF9;&#x8C61;&#x6570;&#x636E;>"</span>);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">for</span>&#xA0;(Person&#xA0;person:personList){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;System.out.println(person);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">if</span>&#xA0;(person.getAge()==38){//&#xA0;&#x4FEE;&#x6539;&#x5E74;&#x9F84;38&#x7684;&#x90FD;&#x6539;&#x4E3A;18<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;person.setAge(18);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#xA0;&#x4FEE;&#x6539;&#x540E;&#x6301;&#x4E45;&#x5316;&#x5BF9;&#x8C61;&#x6570;&#x636E;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;objectList.writerList(personList);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;System.out.println(<span class="hljs-string">"&#x904D;&#x5386;&#x4FEE;&#x6539;&#x6301;&#x4E45;&#x5316;&#x5BF9;&#x8C61;&#x6570;&#x636E;>"</span>);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;List<person>&#xA0;personList1&#xA0;=&#xA0;objectList.readList();<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">for</span>&#xA0;(Person&#xA0;person:personList1){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;System.out.println(person);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;//&#xA0;&#x5220;&#x9664;&#x5BF9;&#x8C61;&#x5B58;&#x50A8;&#x7684;&#x6301;&#x4E45;&#x5316;&#x6587;&#x4EF6;<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="hljs-keyword">if</span>&#xA0;(objectList.isExists()){<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;System.out.println(<span class="hljs-string">"&#x5220;&#x9664;&#x5BF9;&#x8C61;&#x5B58;&#x50A8;&#x7684;&#x6301;&#x4E45;&#x5316;&#x6587;&#x4EF6;"</span>);<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;objectList.delete();<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}<br><br>&#xA0;&#xA0;&#xA0;&#xA0;}<br><br>}<br></person></person></person></list<person></t extends list></t>

序列化的目的

  • 序列化流目的:把对象模型数据按序列化规则进行转化,转化后的数据可以保存到磁盘文本或通过网络传输;
  • 反序列化流目的:把磁盘文件或网络传输的序列化数据按反序列化规则进行转化,恢复成对象模型数据,在程序中可直接操作对象模型数据。

前面的案例都是程序和磁盘的IO操作,接下来的是序列化对象通过网络传输的案例。

2.3.案例三:自己实现Java RMI(远程方法调用)

Java RMI(Remote Method Invocation)Java 远程方法调用,是Java编程语言里的一种用于实现远程方法调用的应用程序编程接口。RMI的宗旨就是尽可能简化远程接口对象的使用。

相类似的远程过程调用RPC(Remote Procedure Call),指的是一个进程调用另一个进程(本地或远程主机的进程)的过程。Java 的 RMI 则在 RPC 的基础上向前又迈进了一步,既提供了分布式对象间的通讯。但Java RMI仅限于Java语言间相互调用,无法实现不同语言间的远程方法调用。

在这感受下怎么实现远程方法调用,好玩时刻来了。

!!!高能预警!!!

篇幅原因,请移步到:自己写了个Java RMI(远程方法调用) 的实现案例 ;

Java序列化流的奇妙之旅

Java序列化流的奇妙之旅

Java往期文章

Java全栈学习路线、学习资源和面试题一条龙

我心里优秀架构师是怎样的?

免费下载经典编程书籍

更多优质文章和资源👇

Java序列化流的奇妙之旅

原创不易:分享,点赞👇

Original: https://www.cnblogs.com/dennyLee2025/p/15977942.html
Author: 渊渟岳
Title: Java序列化流的奇妙之旅

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620498/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球