java对象序列化机制一般来讲有两种用途
需要将对象的状态保存到文件中而后能够通过读入对象状态来重新构造对象恢复程序状态
使用套接字在网络上传送对象的程序来说是很有用的
我们通过让类实现javaioSerializable 接口可以将类序列化这个接口是一个制造者(marker)接口也就是说对于要实现它的类来说该接口不需要实现任何方法它主要用来通知Java虚拟机(JVM)需要将一个对象序列化
对于这个有几点我们需要明确
并非所有类都可以序列化在cmd下我们输入serialver socket可以得到socket是否可序列化的信息实际上socket是不可序列化的
java有很多基础类已经实现了serializable接口比如stringvector等但是比如hashtable就没有实现serializable接口
将对象读出或者写入流的主要类有两个: ObjectOutputStream与ObjectInputStream ObjectOutputStream 提供用来将对象写入输出流的writeObject方法 ObjectInputStream提供从输入流中读出对象的readObject方法使用这些方法的对象必须已经被序列化的也就是说必须已经实现Serializable接口如果你想writeobject一个hashtable对象那么会得到一个异常
下面举个例子
import javaio*;
public class testser implements Serializable {
public int ii;
testser()
{
}
testser( int param )
{
ii = param;
}
}
testser是一个实现了serializable接口的类
读写这个序列化过的类
import javaio*;
public class Ser {
private static String datafile;
datafile=serdata;
public static void main( String[] argv )
{
Systemoutprintln( Java Serialization Demo );
SerData data;
try {
ObjectInputStream in = new ObjectInputStream
( new FileInputStream( datafile ));
data = (SerData) inreadObject();
inclose();
}
catch (Exception e) {
data = new testser();
}
Systemoutprintln( Original data: ii = + dataii );
dataii++;
try {
ObjectOutputStream out = new ObjectOutputStream
( new FileOutputStream( datafile ) );
outwriteObject( data );
outflush();
outclose();
}
catch (Exception e) {
Systemoutprintln( e );
}
}
}
还有可以通过套接字传递序列化对象大概类似
看到这里或许很多人都会有个疑问是否所有的对象都可以序列化呢?
当然是不可以的了至于为什么不可以那就有很多原因了比如:
安全方面的原因比如一个对象拥有privatepublic等field对于一个要传输的对象比如写到文件或者进行rmi传输等等在序列化进行传输的过程中这个对象的private等域是不受保护的
资源分配方面的原因比如socketthread类如果可以序列化进行传输或者保存也无法对他们进行重新的资源分配而且也是没有必要这样实现