?? 對象的序列化和反序列化實踐-java面向對象 - it電子教育門戶 高端java培訓.htm
字號:
FileInputStream("D:""objectFile.obj"));</FONT></P>
<P><FONT face="Times New Roman"> System.out.println("obj1=" +
(String) in.readObject());<BR> System.out.println("obj2=" +
(Date) in.readObject());<BR> Customer obj3 = (Customer)
in.readObject();<BR> System.out.println("obj3=" +
obj3);<BR> int obj4 =
in.readInt();<BR> System.out.println("obj4=" +
obj4);<BR> in.close();<BR>}<BR>}</FONT></P>
<P><FONT face="Times New Roman">class Customer implements
Serializable {<BR>private String name;<BR>private int
age;<BR>public Customer(String name, int age) {<BR>this.name =
name;<BR>this.age = age;<BR>}</FONT></P>
<P><FONT face="Times New Roman">public String toString()
{<BR>return "name=" + name + ", age=" + age;<BR>}<BR>}
</FONT></P>
<P><FONT face="Times New Roman"> 輸出結果如下:</FONT></P>
<P><FONT face="Times New Roman">obj1=你好!</FONT></P>
<P><FONT face="Times New Roman">obj2=Sat Sep 15 22:02:21 CST
2007</FONT></P>
<P><FONT face="Times New Roman">obj3=name=阿蜜果,
age=24</FONT></P>
<P><FONT face="Times New Roman">obj4=123 </FONT></P>
<P><FONT face="Times New Roman"> 因此例比較簡單,在此不再詳述。</FONT></P>
<P><FONT
face="Times New Roman"> 二.實現Serializable接口</FONT></P>
<P><FONT
face="Times New Roman"> ObjectOutputStream只能對Serializable接口的類的對象進行序列化。默認情況下,ObjectOutputStream按照默認方式序列化,這種序列化方式僅僅對對象的非transient的實例變量進行序列化,而不會序列化對象的transient的實例變量,也不會序列化靜態變量。</FONT></P>
<P><FONT
face="Times New Roman"> 當ObjectOutputStream按照默認方式反序列化時,具有如下特點:</FONT></P>
<P><FONT face="Times New Roman"> 1)
如果在內存中對象所屬的類還沒有被加載,那么會先加載并初始化這個類。如果在classpath中不存在相應的類文件,那么會拋出ClassNotFoundException;</FONT></P>
<P><FONT face="Times New Roman"> 2)
在反序列化時不會調用類的任何構造方法。</FONT></P>
<P><FONT
face="Times New Roman"> 如果用戶希望控制類的序列化方式,可以在可序列化類中提供以下形式的writeObject()和readObject()方法。</FONT></P>
<P><FONT face="Times New Roman">private void
writeObject(java.io.ObjectOutputStream out) throws
IOException</FONT></P>
<P><FONT face="Times New Roman">private void
readObject(java.io.ObjectInputStream in) throws IOException,
ClassNotFoundException; </FONT></P>
<P><FONT
face="Times New Roman"> 當ObjectOutputStream對一個Customer對象進行序列化時,如果該對象具有writeObject()方法,那么就會執行這一方法,否則就按默認方式序列化。在該對象的writeObjectt()方法中,可以先調用ObjectOutputStream的defaultWriteObject()方法,使得對象輸出流先執行默認的序列化操作。同理可得出反序列化的情況,不過這次是defaultReadObject()方法。</FONT></P>
<P><FONT
face="Times New Roman"> 有些對象中包含一些敏感信息,這些信息不宜對外公開。如果按照默認方式對它們序列化,那么它們的序列化數據在網絡上傳輸時,可能會被不法份子竊取。對于這類信息,可以對它們進行加密后再序列化,在反序列化時則需要解密,再恢復為原來的信息。</FONT></P>
<P><FONT
face="Times New Roman"> 默認的序列化方式會序列化整個對象圖,這需要遞歸遍歷對象圖。如果對象圖很復雜,遞歸遍歷操作需要消耗很多的空間和時間,它的內部數據結構為雙向列表。</FONT></P>
<P><FONT
face="Times New Roman"> 在應用時,如果對某些成員變量都改為transient類型,將節省空間和時間,提高序列化的性能。</FONT></P>
<P><FONT face="Times New Roman"> 三.
實現Externalizable接口</FONT></P>
<P><FONT
face="Times New Roman"> Externalizable接口繼承自Serializable接口,如果一個類實現了Externalizable接口,那么將完全由這個類控制自身的序列化行為。Externalizable接口聲明了兩個方法:</FONT></P>
<P><FONT face="Times New Roman">public void
writeExternal(ObjectOutput out) throws IOException</FONT></P>
<P><FONT face="Times New Roman">public void
readExternal(ObjectInput in) throws IOException ,
ClassNotFoundException </FONT></P>
<P><FONT
face="Times New Roman"> 前者負責序列化操作,后者負責反序列化操作。</FONT></P>
<P><FONT
face="Times New Roman"> 在對實現了Externalizable接口的類的對象進行反序列化時,會先調用類的不帶參數的構造方法,這是有別于默認反序列方式的。如果把類的不帶參數的構造方法刪除,或者把該構造方法的訪問權限設置為private、默認或protected級別,會拋出java.io.InvalidException:
no valid constructor異常。</FONT></P>
<P><FONT face="Times New Roman"> 四.
可序列化類的不同版本的序列化兼容性</FONT></P>
<P><FONT
face="Times New Roman"> 凡是實現Serializable接口的類都有一個表示序列化版本標識符的靜態變量:</FONT></P>
<P><FONT face="Times New Roman">private static final long
serialVersionUID; </FONT></P>
<P><FONT
face="Times New Roman"> 以上serialVersionUID的取值是Java運行時環境根據類的內部細節自動生成的。如果對類的源代碼作了修改,再重新編譯,新生成的類文件的serialVersionUID的取值有可能也會發生變化。</FONT></P>
<P><FONT
face="Times New Roman"> 類的serialVersionUID的默認值完全依賴于Java編譯器的實現,對于同一個類,用不同的Java編譯器編譯,有可能會導致不同的serialVersionUID,也有可能相同。為了提高哦啊serialVersionUID的獨立性和確定性,強烈建議在一個可序列化類中顯示的定義serialVersionUID,為它賦予明確的值。顯式地定義serialVersionUID有兩種用途:</FONT></P>
<P><FONT face="Times New Roman"> 1)
在某些場合,希望類的不同版本對序列化兼容,因此需要確保類的不同版本具有相同的serialVersionUID;</FONT></P>
<P><FONT face="Times New Roman"> 2)
在某些場合,不希望類的不同版本對序列化兼容,因此需要確保類的不同版本具有不同的serialVersionUID。</FONT></P></DIV></SPAN></TD></TR>
<TR>
<TD width="71%"> </TD>
<TD width="29%">【 <A
href="http://www.mldn.cn/print.jtml?articleid=2585">打印</A> 】【
<A
href="http://www.mldn.cn/member/favlist.jtml?action=add&postid=2585">收藏</A>
】【 <A href="http://www.mldn.cn/email.jtml?articleid=2585"
target=_blank>推薦</A> 】 </TD></TR>
<TR>
<TD colSpan=2>
<TABLE cellSpacing=3 cellPadding=0 width="100%" align=center
bgColor=#ffffff border=0>
<TBODY>
<TR height=25>
<TD align=middle width="33%"><IMG height=95 alt=java視頻教程
src="對象的序列化和反序列化實踐-JAVA面向對象 - IT電子教育門戶 高端JAVA培訓.files/javavideo.gif"
width=642></TD></TR>
<TR>
<TD class=content-table vAlign=top align=middle>
<TABLE>
<TBODY>
<TR>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-8-21/article_view_2251.htm"
rel=external><IMG class=midImg alt=struts2.0入門視頻
src="對象的序列化和反序列化實踐-JAVA面向對象 - IT電子教育門戶 高端JAVA培訓.files/struts2.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=struts2.0入門視頻
href="http://www.mldn.cn/articleview/2007-8-21/article_view_2251.htm"
rel=external>struts2.0入門視頻</A></TD></TR></TBODY></TABLE></TD>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-6-15/article_view_2141.htm"
rel=external><IMG class=midImg
alt=JAVAEE學習流程和學習方法
src="對象的序列化和反序列化實踐-JAVA面向對象 - IT電子教育門戶 高端JAVA培訓.files/j2eejc.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=JAVAEE學習流程和學習方法
href="http://www.mldn.cn/articleview/2007-6-15/article_view_2141.htm"
rel=external>JAVAEE學習流程和學習方..</A></TD></TR></TBODY></TABLE></TD>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-6-5/article_view_2091.htm"
rel=external><IMG class=midImg
alt=1-Java介紹及JDK配置
src="對象的序列化和反序列化實踐-JAVA面向對象 - IT電子教育門戶 高端JAVA培訓.files/javase.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=1-Java介紹及JDK配置
href="http://www.mldn.cn/articleview/2007-6-5/article_view_2091.htm"
rel=external>1-Java介紹及JDK配置..</A></TD></TR></TBODY></TABLE></TD>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-4-19/article_view_2012.htm"
rel=external><IMG class=midImg alt=Oracle中的多表連接
src="對象的序列化和反序列化實踐-JAVA面向對象 - IT電子教育門戶 高端JAVA培訓.files/Oracle.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=Oracle中的多表連接
href="http://www.mldn.cn/articleview/2007-4-19/article_view_2012.htm"
rel=external>Oracle中的多表連接</A></TD></TR></TBODY></TABLE></TD>
<TD>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-4-11/article_view_1978.htm"
rel=external><IMG class=midImg
alt=Struts中logic標簽的使用
src="對象的序列化和反序列化實踐-JAVA面向對象 - IT電子教育門戶 高端JAVA培訓.files/struts.gif"
width=90></A></TD></TR>
<TR>
<TD style="HEIGHT: 22px"> <A
title=Struts中logic標簽的使用
href="http://www.mldn.cn/articleview/2007-4-11/article_view_1978.htm"
rel=external>Struts中logic標簽..</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2>
<TABLE cellSpacing=3 cellPadding=0 width="100%" align=center
bgColor=#ffffff border=0>
<TBODY>
<TR height=25>
<TD align=middle width="33%" bgColor=#aac4c4><FONT
color=#ffffff>相關文章</FONT></TD>
<TD align=middle width="33%" bgColor=#aac4c4><FONT
color=#ffffff>推薦文章</FONT></TD></TR>
<TR>
<TD class=content-table vAlign=top>
<TABLE>
<TBODY>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-11-7/article_view_2650.htm"
rel=external>垃圾收集器與Java程序的性能</A> <IMG
alt=24小時內新文章
src="對象的序列化和反序列化實踐-JAVA面向對象 - IT電子教育門戶 高端JAVA培訓.files/new.gif"
align=absMiddle border=0></TD>
<TD style="TEXT-ALIGN: right"><SPAN
class=link-Date>[11.7]</SPAN></TD></TR>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-11-7/article_view_2652.htm"
rel=external>詳細解析Java中抽象類和接口的..</A> <IMG
alt=24小時內新文章
src="對象的序列化和反序列化實踐-JAVA面向對象 - IT電子教育門戶 高端JAVA培訓.files/new.gif"
align=absMiddle border=0></TD>
<TD style="TEXT-ALIGN: right"><SPAN
class=link-Date>[11.7]</SPAN></TD></TR>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-11-2/article_view_2624.htm"
rel=external>講述java語言中內部類的研究</A></TD>
<TD style="TEXT-ALIGN: right"><SPAN
class=link-Date>[11.2]</SPAN></TD></TR>
<TR>
<TD><A
href="http://www.mldn.cn/articleview/2007-11-1/article_view_2618.htm"
rel=external>通過實例學習Java對象的構造過..</A></TD>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -