对象的序列化和反序列化实践-java面向对象 - it电子教育门户 高端java培训.htm

来自「这是我自己认真整理的java面向对象的各个方面的知识.想和大家一起来分享我的快乐」· HTM 代码 · 共 640 行 · 第 1/3 页

HTM
640
字号
                  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%">&nbsp;</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&amp;postid=2585">收藏</A> 
                  】【 <A href="http://www.mldn.cn/email.jtml?articleid=2585" 
                  target=_blank>推荐</A> 】&nbsp;</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">&nbsp;<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">&nbsp;<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">&nbsp;<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">&nbsp;<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">&nbsp;<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>&nbsp;<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>&nbsp;<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 + =
减小字号Ctrl + -
显示快捷键?