Java对象序列化的概念和实现
上一篇 / 下一篇 2012-10-16 15:59:09 / 个人分类:Java
G| S};m7yo"[0 一、序列化的概念和实现方法
3WZ-DmFic0P o5d"]-bP(V0 序列化的概念就是把一个Object直接转换成为字节流写到硬盘或者网络上。Java序列化技术可以将一个对象的状态写入一个Byte流里,并且可以从其它地方把该Byte流里的数据读出来,重新构造一个相同的对象。这种机制允许将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等系统里。Java的序列化机制是RMI、EJB等技术的技术基础。51Testing软件测试网Vt8F?h)a6A_
e?(}z+Qt0 用途是利用对象的序列化实现保存应用程序的当前工作状态,下次再启动时将自动地恢复到上次执行的状态,例如游戏的存盘。
\h$Gy#z0k-A0ih&Z_/@0l`0 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象 传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。51Testing软件测试网6k6v$\c6Q JZ
.T&o:il.U&]N$iG0 序列化的实现——将需要被序列化的类实现Serializable接口,根据需求读出或者写入对象,看以下的例子。51Testing软件测试网%Nx `V!e.TD)w
import java.io.File; xnVu?C ]l0import java.io.FileInputStream; n@G[w[0import java.io.FileOutputStream; | S E]D!Kd0import java.io.IOException; 1n.Y'Y8dgO2ld^0import java.io.ObjectInputStream;51Testing软件测试网3@I M~9a Mf)J import java.io.ObjectOutputStream;51Testing软件测试网:C/|OT/H#ju import java.io.Serializable;51Testing软件测试网i+w `uR(T import java.net.URISyntaxException; T\ES,to~n ?0import cn.Test.FileInputAndOutputStream; |
jeIbP&J0{
{F}$ltXgv0 // 将对象写入文件51Testing软件测试网3a&pVc*e)d-r
public static void Output(String path)
!sVda1^@&w)m#q0 {51Testing软件测试网]X8v7t`+`
Student s = new Student();51Testing软件测试网*pWDg*Gf"pO"B
s.num = 2;51Testing软件测试网Eo;k:W3?j$~E:Ot$e_
s.name = "xy2";51Testing软件测试网+@JrHJ2x0}E
s.address = "goodPlace2";
,Pp_:U-QR0 s.wifeName = "nobody2";
@8SMp.]0 File f = new File(path);
4V)t6i|yy.Vn0 FileOutputStream fout = null;
Gy8sN#Ec;vj0 ObjectOutputStream bout = null;
tm s7P&@{6B1?0 try51Testing软件测试网#^0vfd@4CN {4d
{
vs+{DV(|']%N.Y*wb0 fout = new FileOutputStream(f);51Testing软件测试网+~"{5M[b1^_ ~]5y3JY
bout = new ObjectOutputStream(fout);
R:r*r+t`c T0 bout.writeObject(s);
yM+w&B0m8x~4`0 bout.flush();51Testing软件测试网;l%e%Z_}b8l1M ]
bout.close();51Testing软件测试网_SXv,bp$U~O
}
8`3S5B|-HB0 catch (IOException e)
m#i%ACbx#B0 {
V+\V!e%e/K#N3s'm0 e.printStackTrace();51Testing软件测试网3dwmMZ2r
}51Testing软件测试网b?B#ajl
}
(d5U.Wz2P]Y-X0 // 将写入的对象读出51Testing软件测试网&b&Wm[*{:]6XR
public static void Input(String path)
;_YTyNz0 {51Testing软件测试网VO,xZ,J
File f = new File(path);51Testing软件测试网Z*a+tu~*?)`
FileInputStream fin = null;
C"me3JT(V0 ObjectInputStream bin = null;51Testing软件测试网J ^BEMS7uF
try51Testing软件测试网? [!OX3d
{
:q%uW"tG0 fin = new FileInputStream(f);51Testing软件测试网(P FtdA L+Dw2@6V
bin = new ObjectInputStream(fin);51Testing软件测试网h.LP6sD$z{J fm
Student s = (Student) bin.readObject();
._`+Z ?zY0 System.out.println(s.num + "..." + s.name
/Xm O\,L F0 + "..." + s.address + "..." + s.wifeName);51Testing软件测试网?c%K2T\5fb
}51Testing软件测试网5D_%@ _9c$U+QDDQ
catch (Exception e)51Testing软件测试网H)E$RYEy e+W
{51Testing软件测试网(V%w2BQ$}v|A:D+s
e.printStackTrace();
E-soJ3L ?N;`U h0 }51Testing软件测试网T[T7H%X4L
}
5U6Y8sMibxc`i0 // writeObject和readObject是线程安全的,传输过程中不允许被并发访问,故对象能不断传来51Testing软件测试网_Rd^f#K C
public static void main(String[] args) throws URISyntaxException51Testing软件测试网Baz.F*xrndi8X)z
{51Testing软件测试网+i8j2A ~@Gi
String path = FileInputAndOutputStream.class.getClassLoader()51Testing软件测试网n q7}[1|*F py l
.getResource("对象文档.txt").toURI().getPath();
B4O_9vmE7~S0 Output(path);51Testing软件测试网:W8o f'MgV2YOA
Input(path);51Testing软件测试网&i}c7Dth)vGW A
}51Testing软件测试网6K%d%W'cd+c6yl{
}51Testing软件测试网 BMD9nt#QOr{
@SuppressWarnings("serial")
1Qb!H.L_S$}7o0class Student implements Serializable51Testing软件测试网Y'W\1cm'KWW
{
8k9u;vZ)G_0 int num = 1;
hus0nNw$],`0 String name = "xy";
Sh6rR,k`5k X0 String address = "goodPlace";51Testing软件测试网:_,V]o6I|*GoXN
transient String wifeName = "nobody";51Testing软件测试网l:mLgG
}51Testing软件测试网(JRo E)F
cJ,ug?W0 二、序列化的注意点
B}To#s5SL m0vx7b2xD/}A6W0 注意点151Testing软件测试网\A2c%l)n!ZC]
51Testing软件测试网-@;E2U ]'H如果某个类能够被序列化,其子类也可以被序列化。如果该类有父类,则分两种情况来考虑,如果该父类已经实现了可序列化接口。 则其父类的相应字段及属性的处理和该类相同;如果该类的父类没有实现可序列化接口,则该类的父类所有的字段属性将不会序列化。51Testing软件测试网8P!x4{x IE-u-kAW
51Testing软件测试网 dUC6i,W'_注意点251Testing软件测试网 rA8@p"s
51Testing软件测试网ilL?UD*bXAi#{f声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态,transient代表对象的临时数据。
5[Ajt3^c!x;q0f A&Y)A B8G0]E0 注意点3
*?$}iIiN0b ]7L&Mh L)_$j0 在java.io包提供的涉及对象的序列化的类与接口有:51Testing软件测试网J dL%g;VQ'ite
51Testing软件测试网 h%G4Z&wP%k,a/R4p$L)q● ObjectOutput接口
A;a9` q*Ul;O9K`0