Java对象序列化的概念和实现

上一篇 / 下一篇  2012-10-16 15:59:09 / 个人分类:Java

G| S};m7yo"[0  一、序列化的概念和实现方法

3WZ-DmFic0

P o5d"]-bP(V0  序列化的概念就是把一个Object直接转换成为字节流写到硬盘或者网络上。Java序列化技术可以将一个对象的状态写入一个Byte流里,并且可以从其它地方把该Byte流里的数据读出来,重新构造一个相同的对象。这种机制允许将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等系统里。Java的序列化机制是RMI、EJB等技术的技术基础。51Testing软件测试网 Vt8F?h)a6A_

e?(}z+Qt0  用途是利用对象的序列化实现保存应用程序的当前工作状态,下次再启动时将自动地恢复到上次执行的状态,例如游戏的存盘。

\h$Gy#z0

k-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`u R(T
import java.net.URISyntaxException;
T\ES,to~n ?0import cn.Test.FileInputAndOutputStream;
public class ObjectIO
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软件测试网_S Xv,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软件测试网V O,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 f m
   Student s = (Student) bin.readObject();
._`+Z? z Y0   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;`Uh0  }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软件测试网 BMD9n t#Q Or{
@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 m0

vx7b2xD/}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?U D*bXAi#{f

  声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态,transient代表对象的临时数据。

5[Ajt3^c!x;q0

f A&Y)A B8G0]E0  注意点3

*?$}iIiN0

b ]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

Eu#`1D L.m0  该接口继承DataOutput接口并支持对象的序列化,其writeObject()方法实现存储一个对象。51Testing软件测试网4Oi{rpy3s?

51Testing软件测试网j LNH1g o3R

  ● ObjectInput接口

c9s~0rk:M2I051Testing软件测试网 q.s @`,H;F$}

  该接口继承DataInput接口并支持对象的序列化,其readObject()方法实现读取一个对象。

_4O niE;}051Testing软件测试网#Et^hg+E9T(R6q

  ● ObjectOutputStream类51Testing软件测试网*f]y)[/_jB|9Rb

51Testing软件测试网)c(T j X` d

  该类继承OutputStream类并实现ObjectOutput接口,可调用接口中的writeObject方法。

J'qn)~S6H051Testing软件测试网 K w6g@hOq9F

  ● ObjectInputStream类。51Testing软件测试网5F$D(v(n'q:C

51Testing软件测试网r-c5|(t1j$o)M i

  该类继承InputStream类并实现ObjectInput接口,可调用接口中的readObject方法。

B_R z1LD,^R/}0

+zz&tS| v0  注意点4

e(\5lke0

5Ng6d*A!c\]0  对于父类的处理时,若父类没有实现序列化接口,则其必须有默认的构造函数,否则编译的时候就会报错。在反序列化的时候,默认构造函数会被调用。 若把父类标记为可以序列化,则在反序列化的时候,其默认构造函数不会被调用。因为Java对序列化的对象进行反序列化的时候,直接从流里获取其对象数据来 生成一个对象实例,而不是通过其构造函数来完成。

S#w:Wc&T b%xO051Testing软件测试网^9v)|XZ{1M

TAG:

 

评分:0

我来说两句

Open Toolbar