﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-GnillinG-随笔分类-Java</title><link>http://www.blogjava.net/gnilling/category/37845.html</link><description>&amp;nbsp&amp;nbsp&amp;nbsp The more you share, the more you get</description><language>zh-cn</language><lastBuildDate>Tue, 24 Feb 2009 12:43:20 GMT</lastBuildDate><pubDate>Tue, 24 Feb 2009 12:43:20 GMT</pubDate><ttl>60</ttl><item><title>弄清Java中的IO</title><link>http://www.blogjava.net/gnilling/archive/2009/02/24/256506.html</link><dc:creator>Albert Ling</dc:creator><author>Albert Ling</author><pubDate>Tue, 24 Feb 2009 12:29:00 GMT</pubDate><guid>http://www.blogjava.net/gnilling/archive/2009/02/24/256506.html</guid><wfw:comment>http://www.blogjava.net/gnilling/comments/256506.html</wfw:comment><comments>http://www.blogjava.net/gnilling/archive/2009/02/24/256506.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gnilling/comments/commentRss/256506.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gnilling/services/trackbacks/256506.html</trackback:ping><description><![CDATA[<span style="font-family: Times New Roman;">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" />
<link rel="themeData" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
.MsoChpDefault
{
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";}
</style>
<![endif]-->
<p>&nbsp;&nbsp;&nbsp; Java<span style="font-family: 宋体;">的核心库</span>java.io<span style="font-family: 宋体;">提供了全面的</span>IO<span style="font-family: 宋体;">接口，包括：文件读写，标准设备输出等等。</span>Java<span style="font-family: 宋体;">中</span>IO<span style="font-family: 宋体;">是以流为基础进行输入输出的，所有数据被串行化写入输出流，或者从输入流读入。在具体使用中很多初学者对</span>Java.io<span style="font-family: 宋体;">包的使用非常含糊，本文将详细解说关于</span>Java.io<span style="font-family: 宋体;">的使用。</span></p>
<p><span>-----------------------------------------------------<br />
</span><span style="font-family: 宋体;">　　<strong>一．</strong></span><strong> Input<span style="font-family: 宋体;">和</span></strong><span><strong>Output</strong> <br />
&nbsp;&nbsp;&nbsp;
</span>stream<span style="font-family: 宋体;">代表的是任何有能力产出数据的数据源，或是任何有能力接收数据的接收源。在</span>Java<span style="font-family: 宋体;">的</span>IO<span style="font-family: 宋体;">系统中，所有的</span>stream<span style="font-family: 宋体;">（包括</span>Input<span style="font-family: 宋体;">和</span>Out stream<span style="font-family: 宋体;">）都包括两种类型：</span><span><br />
&nbsp;
</span>1.1 <span style="font-family: 宋体;">以字节为导向的</span><span>stream<br />
</span><span style="font-family: 宋体;">　　以字节为导向的</span>stream<span style="font-family: 宋体;">，表示以字节为单位从</span>stream<span style="font-family: 宋体;">中读取或往</span>stream<span style="font-family: 宋体;">中写入信息。以字节为导向的</span>stream<span style="font-family: 宋体;">包括下面几种类型：</span><span><br />
</span><span>input<br />
</span>stream<span style="font-family: 宋体;">：</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) ByteArrayInputStream<span style="font-family: 宋体;">：把内存中的一个缓冲区作为</span>InputStream<span style="font-family: 宋体;">使用</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) StringBufferInputStream<span style="font-family: 宋体;">：把一个</span>String<span style="font-family: 宋体;">对象作为</span><span>InputStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>3) FileInputStream<span style="font-family: 宋体;">：把一个文件作为</span>InputStream<span style="font-family: 宋体;">，实现对文件的读取操作</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>4) PipedInputStream<span style="font-family: 宋体;">：实现了</span>pipe<span style="font-family: 宋体;">的概念，主要在线程中使用</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>5) SequenceInputStream<span style="font-family: 宋体;">：把多个</span>InputStream<span style="font-family: 宋体;">合并为一个</span><span>InputStream<br />
</span><span>Out<br />
</span><span>stream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) ByteArrayOutputStream<span style="font-family: 宋体;">：把信息存入内存中的一个缓冲区中</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) FileOutputStream<span style="font-family: 宋体;">：把信息存入文件中</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>3) PipedOutputStream<span style="font-family: 宋体;">：实现了</span>pipe<span style="font-family: 宋体;">的概念，主要在线程中使用</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>4) SequenceOutputStream<span style="font-family: 宋体;">：把多个</span>OutStream<span style="font-family: 宋体;">合并为一个</span><span>OutStream<br />
&nbsp;
</span>1.2 <span style="font-family: 宋体;">以</span>Unicode<span style="font-family: 宋体;">字符为导向的</span><span>stream<br />
</span><span style="font-family: 宋体;">　　以</span>Unicode<span style="font-family: 宋体;">字符为导向的</span>stream<span style="font-family: 宋体;">，表示以</span>Unicode<span style="font-family: 宋体;">字符为单位从</span>stream<span style="font-family: 宋体;">中读取或往</span>stream<span style="font-family: 宋体;">中写入信息。以</span>Unicode<span style="font-family: 宋体;">字符为导向的</span>stream<span style="font-family: 宋体;">包括下面几种类型：</span><span><br />
</span><span>Input<br />
</span><span>Stream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) CharArrayReader<span style="font-family: 宋体;">：与</span>ByteArrayInputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) StringReader<span style="font-family: 宋体;">：与</span>StringBufferInputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>3) FileReader<span style="font-family: 宋体;">：与</span>FileInputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>4) PipedReader<span style="font-family: 宋体;">：与</span>PipedInputStream<span style="font-family: 宋体;">对应</span><span><br />
</span><span>Out<br />
</span><span>Stream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) CharArrayWrite<span style="font-family: 宋体;">：与</span>ByteArrayOutputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) StringWrite<span style="font-family: 宋体;">：无与之对应的以字节为导向的</span><span>stream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>3) FileWrite<span style="font-family: 宋体;">：与</span>FileOutputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>4) PipedWrite<span style="font-family: 宋体;">：与</span>PipedOutputStream<span style="font-family: 宋体;">对应</span><span><br />
</span> <span style="font-family: 宋体;">　&nbsp; 以字符为导向的</span>stream<span style="font-family: 宋体;">基本上对有与之相对应的以字节为导向的</span>stream<span style="font-family: 宋体;">。两个对应类实现的功能相同，字是在操作时的导向不同。如</span> CharArrayReader<span style="font-family: 宋体;">：和</span>ByteArrayInputStream<span style="font-family: 宋体;">的作用都是把内存中的一个缓冲区作为</span>InputStream<span style="font-family: 宋体;">使用，所不同的</span>
<span style="font-family: 宋体;">是前者每次从内存中读取一个字节的信息，而后者每次从内存中读取一个字符。</span><span><br />
&nbsp;
</span>1.3 <span style="font-family: 宋体;">两种不现导向的</span>stream<span style="font-family: 宋体;">之间的转换</span><span><br />
&nbsp;&nbsp;&nbsp;
</span>InputStreamReader<span style="font-family: 宋体;">和</span>OutputStreamReader<span style="font-family: 宋体;">：把一个以字节为导向的</span>stream<span style="font-family: 宋体;">转换成一个以字符为导向的</span>stream<span style="font-family: 宋体;">。</span></p>
<p>--------------------------------------------------<br />
&nbsp;&nbsp;&nbsp; <strong>二</strong><strong>. stream<span style="font-family: 宋体;">添加属性</span></strong><span><br />
&nbsp;
</span>2.1 &#8220;<span style="font-family: 宋体;">为</span>stream<span style="font-family: 宋体;">添加属性</span>&#8221;<span style="font-family: 宋体;">的作用</span><span><br />
</span><span style="font-family: 宋体;">　　运用上面介绍的</span>Java<span style="font-family: 宋体;">中操作</span>IO<span style="font-family: 宋体;">的</span>API<span style="font-family: 宋体;">，我们就可完成我们想完成的任何操作了。但通过</span>FilterInputStream<span style="font-family: 宋体;">和</span>FilterOutStream<span style="font-family: 宋体;">的子类，我们可以为</span>stream<span style="font-family: 宋体;">添加属性。下面以一个例子来说明这种功能的作用。</span><span><br />
</span><span style="font-family: 宋体;">　　如果我们要往一个文件中写入数据，我们可以这样操作：</span><span><br />
FileOutStream fs = new FileOutStream(&#8220;test.txt&#8221;);<br />
</span> <span style="font-family: 宋体;">　&nbsp; 然后就可以通过产生的</span>fs<span style="font-family: 宋体;">对象调用</span>write()<span style="font-family: 宋体;">函数来往</span>test.txt<span style="font-family: 宋体;">文件中写入数据了。但是，如果我们想实现</span>&#8220;<span style="font-family: 宋体;">先把要写入文件的数据先缓存到内存</span>
<span style="font-family: 宋体;">中，再把缓存中的数据写入文件中</span>&#8221;<span style="font-family: 宋体;">的功能时，上面的</span>API<span style="font-family: 宋体;">就没有一个能满足我们的需求了。但是通过</span>FilterInputStream<span style="font-family: 宋体;">和</span> FilterOutStream<span style="font-family: 宋体;">的子类，为</span>FileOutStream<span style="font-family: 宋体;">添加我们所需要的功能。</span><span><br />
&nbsp;
</span>2.2 FilterInputStream<span style="font-family: 宋体;">的各种类型</span><span><br />
&nbsp;&nbsp;&nbsp;
</span>2.2.1 <span style="font-family: 宋体;">用于封装以字节为导向的</span><span>InputStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) DataInputStream<span style="font-family: 宋体;">：从</span>stream<span style="font-family: 宋体;">中读取基本类型（</span>int<span style="font-family: 宋体;">、</span>char<span style="font-family: 宋体;">等）数据。</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) BufferedInputStream<span style="font-family: 宋体;">：使用缓冲区</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>3) LineNumberInputStream<span style="font-family: 宋体;">：会记录</span>input stream<span style="font-family: 宋体;">内的行数，然后可以调用</span>getLineNumber()<span style="font-family: 宋体;">和</span><span>setLineNumber(int)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>4) PushbackInputStream<span style="font-family: 宋体;">：很少用到，一般用于编译器开发</span><span><br />
&nbsp;&nbsp;&nbsp;
</span>2.2.2 <span style="font-family: 宋体;">用于封装以字符为导向的</span><span>InputStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) <span style="font-family: 宋体;">没有与</span>DataInputStream<span style="font-family: 宋体;">对应的类。除非在要使用</span>readLine()<span style="font-family: 宋体;">时改用</span>BufferedReader<span style="font-family: 宋体;">，否则使用</span><span>DataInputStream<br />
&nbsp;&nbsp; &nbsp;&nbsp;
</span>2) BufferedReader<span style="font-family: 宋体;">：与</span>BufferedInputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;&nbsp; &nbsp;&nbsp;
</span>3) LineNumberReader<span style="font-family: 宋体;">：与</span>LineNumberInputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>4) PushBackReader<span style="font-family: 宋体;">：与</span>PushbackInputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;
</span>2.3 FilterOutStream<span style="font-family: 宋体;">的各种类型</span><span><br />
&nbsp;&nbsp;&nbsp;
</span>2.2.3 <span style="font-family: 宋体;">用于封装以字节为导向的</span><span>OutputStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) DataIOutStream<span style="font-family: 宋体;">：往</span>stream<span style="font-family: 宋体;">中输出基本类型（</span>int<span style="font-family: 宋体;">、</span>char<span style="font-family: 宋体;">等）数据。</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) BufferedOutStream<span style="font-family: 宋体;">：使用缓冲区</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>3) PrintStream<span style="font-family: 宋体;">：产生格式化输出</span><span><br />
&nbsp;&nbsp;&nbsp;
</span>2.2.4 <span style="font-family: 宋体;">用于封装以字符为导向的</span><span>OutputStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) BufferedWrite<span style="font-family: 宋体;">：与对应</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) PrintWrite<span style="font-family: 宋体;">：与对应</span></p>
<p>--------------------------------------------------<br />
</p>
<p><span>&nbsp;&nbsp;&nbsp;
</span><span><strong>三. RandomAccessFile</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) <span style="font-family: 宋体;">可通过</span>RandomAccessFile<span style="font-family: 宋体;">对象完成对文件的读写操作</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) <span style="font-family: 宋体;">在产生一个对象时，可指明要打开的文件的性质：</span>r<span style="font-family: 宋体;">，只读；</span>w<span style="font-family: 宋体;">，只写；</span>rw<span style="font-family: 宋体;">可读写</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>3) <span style="font-family: 宋体;">可以直接跳到文件中指定的位置</span></p>
</span>
<img src ="http://www.blogjava.net/gnilling/aggbug/256506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gnilling/" target="_blank">Albert Ling</a> 2009-02-24 20:29 <a href="http://www.blogjava.net/gnilling/archive/2009/02/24/256506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对象的序列化和反序列化</title><link>http://www.blogjava.net/gnilling/archive/2009/02/22/256133.html</link><dc:creator>Albert Ling</dc:creator><author>Albert Ling</author><pubDate>Sun, 22 Feb 2009 15:07:00 GMT</pubDate><guid>http://www.blogjava.net/gnilling/archive/2009/02/22/256133.html</guid><wfw:comment>http://www.blogjava.net/gnilling/comments/256133.html</wfw:comment><comments>http://www.blogjava.net/gnilling/archive/2009/02/22/256133.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gnilling/comments/commentRss/256133.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gnilling/services/trackbacks/256133.html</trackback:ping><description><![CDATA[<span style="font-family: Times New Roman;">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" />
<link rel="themeData" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:DontVertAlignCellWithSp/>
<w:DontBreakConstrainedForcedTables/>
<w:DontVertAlignInTxbx/>
<w:Word11KerningPairs/>
<w:CachedColBalance/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
<m:mathPr>
<m:mathFont m:val="Cambria Math" />
<m:brkBin m:val="before" />
<m:brkBinSub m:val="--" />
<m:smallFrac m:val="off" />
<m:dispDef/>
<m:lMargin m:val="0" />
<m:rMargin m:val="0" />
<m:defJc m:val="centerGroup" />
<m:wrapIndent m:val="1440" />
<m:intLim m:val="subSup" />
<m:naryLim m:val="undOvr" />
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267">
<w:LsdException locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal" />
<w:LsdException locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 2" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 3" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 4" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 5" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 6" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 7" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 8" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 9" />
<w:LsdException locked="false" priority="39" name="toc 1" />
<w:LsdException locked="false" priority="39" name="toc 2" />
<w:LsdException locked="false" priority="39" name="toc 3" />
<w:LsdException locked="false" priority="39" name="toc 4" />
<w:LsdException locked="false" priority="39" name="toc 5" />
<w:LsdException locked="false" priority="39" name="toc 6" />
<w:LsdException locked="false" priority="39" name="toc 7" />
<w:LsdException locked="false" priority="39" name="toc 8" />
<w:LsdException locked="false" priority="39" name="toc 9" />
<w:LsdException locked="false" priority="35" qformat="true" name="caption" />
<w:LsdException locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title" />
<w:LsdException locked="false" priority="1" name="Default Paragraph Font" />
<w:LsdException locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle" />
<w:LsdException locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong" />
<w:LsdException locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis" />
<w:LsdException locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid" />
<w:LsdException locked="false" unhidewhenused="false" name="Placeholder Text" />
<w:LsdException locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1" />
<w:LsdException locked="false" unhidewhenused="false" name="Revision" />
<w:LsdException locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph" />
<w:LsdException locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote" />
<w:LsdException locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6" />
<w:LsdException locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis" />
<w:LsdException locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis" />
<w:LsdException locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference" />
<w:LsdException locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference" />
<w:LsdException locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title" />
<w:LsdException locked="false" priority="37" name="Bibliography" />
<w:LsdException locked="false" priority="39" qformat="true" name="TOC Heading" />
</w:LatentStyles>
</xml><![endif]--><style>
<!-- /* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:1;
mso-generic-font-family:roman;
mso-font-format:other;
mso-font-pitch:variable;
mso-font-signature:0 0 0 0 0 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1073750139 0 0 159 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-noshow:yes;
mso-style-priority:99;
color:purple;
mso-themecolor:followedhyperlink;
text-decoration:underline;
text-underline:single;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:42.55pt;
mso-footer-margin:49.6pt;
mso-paper-source:0;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
</style>
<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" />
<link rel="themeData" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
.MsoChpDefault
{
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";}
</style>
<![endif]-->
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">当两个进程在进行远程通信时，彼此可以发送各种类型的数据。无论是何种类型的数据，都会以二进制序列的形式在网络上传送。发送方需要把这个</span>Java<span style="font-family: 宋体;">对象转换为字节序列，才能在网络上传送；接收方则需要把字节序列再恢复为</span>Java<span style="font-family: 宋体;">对象。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">把</span>Java<span style="font-family: 宋体;">对象转换为字节序列的过程称为对象的序列化。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">把字节序列恢复为</span>Java<span style="font-family: 宋体;">对象的过程称为对象的反序列化。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">对象的序列化主要有两种用途：</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">1<span style="font-family: 宋体;">）</span>&nbsp;<span style="font-family: 宋体;">把对象的字节序列永久地保存到硬盘上，通常存放在一个文件中；</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">2<span style="font-family: 宋体;">）</span>&nbsp;<span style="font-family: 宋体;">在网络上传送对象的字节序列。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21.1pt;"><strong><span style="font-family: 宋体;">一．</span>JDK</strong><strong><span style="font-family: 宋体;">类库中的序列化</span>API</strong></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">java.io.ObjectOutputStream<span style="font-family: 宋体;">代表对象输出流，它的</span><span>writeObject(Object
obj)</span><span style="font-family: 宋体;">方法可对参数指定的</span>obj<span style="font-family: 宋体;">对象进行序列化，把得到的字节序列写到一个目标输出流中。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">java.io.ObjectInputStream<span style="font-family: 宋体;">代表对象输入流，它的</span>readObject()<span style="font-family: 宋体;">方法从一个源输入流中读取字节序列，再把它们反序列化为一个对象，并将其返回。、</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">只有实现了</span>Serializable<span style="font-family: 宋体;">和</span>Externalizable<span style="font-family: 宋体;">接口的类的对象才能被序列化。</span>Externalizable<span style="font-family: 宋体;">接口继承自</span>Serializable<span style="font-family: 宋体;">接口，实现</span>Externalizable<span style="font-family: 宋体;">接口的类完全由自身来控制序列化的行为，而仅实现</span>Serializable<span style="font-family: 宋体;">接口的类可以采用默认的序列化方式</span>
<span style="font-family: 宋体;">。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">对象序列化包括如下步骤：</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">1<span style="font-family: 宋体;">）</span>&nbsp;<span style="font-family: 宋体;">创建一个对象输出流，它可以包装一个其他类型的目标输出流，如文件输出流；</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">2<span style="font-family: 宋体;">）</span>&nbsp;<span style="font-family: 宋体;">通过对象输出流的</span>writeObject()<span style="font-family: 宋体;">方法写对象。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">对象反序列化的步骤如下：</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">1<span style="font-family: 宋体;">）</span>&nbsp;<span style="font-family: 宋体;">创建一个对象输入流，它可以包装一个其他类型的源输入流，如文件输入流；</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">2<span style="font-family: 宋体;">）</span>&nbsp;<span style="font-family: 宋体;">通过对象输入流的</span>readObject()<span style="font-family: 宋体;">方法读取对象。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">下面让我们来看一个对应的例子，类的内容如下：</span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;cn.albert.ling.p386;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Date;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ObjectSaver&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;&lt;a&nbsp;href="MailTo:ling.albert.cn@gmail.com"&gt;albert&nbsp;ling&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Creation&nbsp;date:&nbsp;2009&nbsp;2 22&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;File(</span><span style="color: #000000;">"</span><span style="color: #000000;">D:\\temp.txt</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectOutputStream&nbsp;out&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ObjectOutputStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileOutputStream(file));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;序列化对象</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Customer&nbsp;customer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Customer(</span><span style="color: #000000;">"</span><span style="color: #000000;">LS</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">24</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.writeObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">Morning!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.writeObject(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Date());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.writeObject(customer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.writeInt(</span><span style="color: #000000;">123</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;写入基本类型数据</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;反序列化对象</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectInputStream&nbsp;in&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ObjectInputStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileInputStream(file));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">obj1=</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(String)&nbsp;in.readObject());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">obj2=</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(Date)&nbsp;in.readObject());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Customer&nbsp;obj3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Customer)&nbsp;in.readObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">obj3=</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;obj3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;obj4&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;in.readInt();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">obj4=</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;obj4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.delete();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Customer&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Serializable&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1L</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Customer(String&nbsp;name,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;age)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.age&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;toString()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">name=</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;name&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;age=</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span></div>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" />
<link rel="themeData" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
.MsoChpDefault
{
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";}
</style>
<![endif]-->
</p>
<p style="margin-bottom: 3pt; text-indent: 21.1pt;"><strong><span style="font-family: 宋体;">二．实现</span>Serializable</strong><strong><span style="font-family: 宋体;">接口</span></strong></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">ObjectOutputStream<span style="font-family: 宋体;">只能对</span>Serializable<span style="font-family: 宋体;">接口的类的对象进行序列化。默认情况下，</span>ObjectOutputStream<span style="font-family: 宋体;">按照默认方式序列化，这种序列化方式仅仅对对象的非</span>transient<span style="font-family: 宋体;">的实例变量进行序列化，而不会序列化对象的</span>transient<span style="font-family: 宋体;">的实例变量，也不会序列化静态变量。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">当</span>ObjectOutputStream<span style="font-family: 宋体;">按照默认方式反序列化时，具有如下特点：</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">1<span style="font-family: 宋体;">）如果在内存中对象所属的类还没有被加载，那么会先加载并初始化这个类。如果在</span>classpath<span style="font-family: 宋体;">中不存在相应的类文件，那么会抛出</span>ClassNotFoundException<span style="font-family: 宋体;">；</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">2<span style="font-family: 宋体;">）在反序列化时不会调用类的任何构造方法。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">如果用户希望控制类的序列化方式，可以在可序列化类中提供以下形式的</span>writeObject()<span style="font-family: 宋体;">和</span>readObject()<span style="font-family: 宋体;">方法。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span>private void
writeObject(java.io.ObjectOutputStream out) throws IOException</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span>private void
readObject(java.io.ObjectInputStream in) throws IOException,
ClassNotFoundException;</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">当</span>ObjectOutputStream<span style="font-family: 宋体;">对一个</span>Customer<span style="font-family: 宋体;">对象进行序列化时，如果该对象具有</span>writeObject()<span style="font-family: 宋体;">方法，那么就会执行这一方法，否则就按默认方式序列化。在该对象的</span>writeObjectt()<span style="font-family: 宋体;">方法中，可以先调用</span>ObjectOutputStream<span style="font-family: 宋体;">的</span>defaultWriteObject()<span style="font-family: 宋体;">方法，使得对象输出流先执行默认的序列化操作。同理可得出反序列化的情况，不过这次是</span>defaultReadObject()<span style="font-family: 宋体;">方法。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">有些对象中包含一些敏感信息，这些信息不宜对外公开。如果按照默认方式对它们序列化，那么它们的序列化数据在网络上传输时，可能会被不法份子窃取。对于这类信息，可以对它们进行加密后再序列化，在反序列化时则需要解密，再恢复为原来的信息。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">默认的序列化方式会序列化整个对象图，这需要递归遍历对象图。如果对象图很复杂，递归遍历操作需要消耗很多的空间和时间，它的内部数据结构为双向列表。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">在应用时，如果对某些成员变量都改为</span>transient<span style="font-family: 宋体;">类型，将节省空间和时间，提高序列化的性能。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21.1pt;"><strong><span style="font-family: 宋体;">三．实现</span>Externalizable</strong><strong><span style="font-family: 宋体;">接口</span></strong></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">Externalizable<span style="font-family: 宋体;">接口继承自</span>Serializable<span style="font-family: 宋体;">接口，如果一个类实现了</span>Externalizable<span style="font-family: 宋体;">接口，那么将完全由这个类控制自身的序列化行为。</span>Externalizable<span style="font-family: 宋体;">接口声明了两个方法：</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span>public void
writeExternal(ObjectOutput out) throws IOException</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span>public void
readExternal(ObjectInput in) throws IOException , ClassNotFoundException</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">前者负责序列化操作，后者负责反序列化操作。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">在对实现了</span>Externalizable<span style="font-family: 宋体;">接口的类的对象进行反序列化时，会先调用类的不带参数的构造方法，这是有别于默认反序列方式的。如果把类的不带参数的构造方法删除，或者把该构造方法的访问权限设置为</span>private<span style="font-family: 宋体;">、默认或</span>protected<span style="font-family: 宋体;">级别，会抛出</span>java.io.InvalidException: no valid constructor<span style="font-family: 宋体;">异常。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21.1pt;"><strong><span style="font-family: 宋体;">四．可序列化类的不同版本的序列化兼容性</span></strong></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">凡是实现</span>Serializable<span style="font-family: 宋体;">接口的类都有一个表示序列化版本标识符的静态变量：</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span>private static
final long serialVersionUID;</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">以上</span>serialVersionUID<span style="font-family: 宋体;">的取值是</span>Java<span style="font-family: 宋体;">运行时环境根据类的内部细节自动生成的。如果对类的源代码作了修改，再重新编译，新生成的类文件的</span>serialVersionUID<span style="font-family: 宋体;">的取值有可能也会发生变化。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">类的</span>serialVersionUID<span style="font-family: 宋体;">的默认值完全依赖于</span>Java<span style="font-family: 宋体;">编译器的实现，对于同一个类，用不同的</span>Java<span style="font-family: 宋体;">编译器编译，有可能会导致不同的</span>serialVersionUID<span style="font-family: 宋体;">，也有可能相同。为了提高哦啊</span>serialVersionUID<span style="font-family: 宋体;">的独立性和确定性，强烈建议在一个可序列化类中显示的定义</span>serialVersionUID<span style="font-family: 宋体;">，为它赋予明确的值。显式地定义</span>serialVersionUID<span style="font-family: 宋体;">有两种用途：</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">1<span style="font-family: 宋体;">）在某些场合，希望类的不同版本对序列化兼容，因此需要确保类的不同版本具有相同的</span>serialVersionUID<span style="font-family: 宋体;">；</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">2<span style="font-family: 宋体;">）</span><span style="font-family: 宋体;">在某些场合，不希望类的不同版本对序列化兼容，因此需要确保类的不同版本具有不同的</span>serialVersionUID<span style="font-family: 宋体;">。</span></p>
<p>&nbsp;</p>
</span>
<img src ="http://www.blogjava.net/gnilling/aggbug/256133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gnilling/" target="_blank">Albert Ling</a> 2009-02-22 23:07 <a href="http://www.blogjava.net/gnilling/archive/2009/02/22/256133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>