java

位置:IT落伍者 >> java >> 浏览文章

关于java中的对象序列化


发布日期:2021年02月28日
 
关于java中的对象序列化

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类如果可以序列化进行传输或者保存也无法对他们进行重新的资源分配而且也是没有必要这样实现

               

上一篇:JAVA版MD5加密算法

下一篇:Java读取xml文件的四种方法