电脑技术学习

原创-关于java中的对象序列化

dn001
内容: java对象序列化机制一般来讲有两种用途:
1.需要将对象的状态保存到文件中,而后能够通过读入对象状态来重新构造对象,恢复程序状态
2.使用套接字在网络上传送对象的程序来说,是很有用的。
我们通过让类实现java.io.Serializable 接口可以将类序列化。这个接口是一个制造者(marker)接口。也就是说,对于要实现它的类来说,该接口不需要实现任何方法。它主要用来通知Java虚拟机(JVM),需要将一个对象序列化。
对于这个,有几点我们需要明确:
1.并非所有类都可以序列化,在cmd下,我们输入serialver java.net.socket,可以得到socket是否可序列化的信息,实际上socket是不可序列化的。
2.java有很多基础类已经实现了serializable接口,比如string,vector等。但是比如hashtable就没有实现serializable接口。
将对象读出或者写入流的主要类有两个: ObjectOutputStream与ObjectInputStream 。ObjectOutputStream 提供用来将对象写入输出流的writeObject方法, ObjectInputStream提供从输入流中读出对象的readObject方法。使用这些方法的对象必须已经被序列化的。也就是说,必须已经实现Serializable接口。如果你想writeobject一个hashtable对象,那么,会得到一个异常。
下面举个例子:
import java.io.*;

public class testser implements Serializable {
public int ii;

testser()
{

}

testser( int param )
{
ii = param;
}
}

testser是一个实现了serializable接口的类。

读写这个序列化过的类:
import java.io.*;

public class Ser {

private static String datafile;
datafile="ser.data";

public static void main( String[] argv )
{
System.out.println( "Java Serialization Demo." );
SerData data;
try {
ObjectInputStream in = new ObjectInputStream( new FileInputStream( datafile ));
data = (SerData) in.readObject();
in.close();
}
catch (Exception e) {
data = new testser();
}
System.out.println( "Original data: ii = " + data.ii );
data.ii++;
try {
ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream( datafile ) );
out.writeObject( data );
out.flush();
out.close();
}
catch (Exception e) {
System.out.println( e );
}
}
}

还有可以通过套接字传递序列化对象,大概类似。

看到这里或许很多人都会有个疑问,是否所有的对象都可以序列化呢?
当然是不可以的了,至于为什么不可以,那就有很多原因了,比如:
1.安全方面的原因,比如一个对象拥有private,public等field,对于一个
要传输的对象,比如写到文件,或者进行rmi传输等等,在序列化进行传输的
过程中,这个对象的private等域是不受保护的.
2.资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输
或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现.


【matrix 原创】 转载请注明来自Matrix.org.cn


Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd

标签: