Java对象序列化使用基础

发表于:2009-3-11 10:49

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:魏霞    来源:网易博客

  2、定制序列化过程:

  序列化通常可以自动完成,但有时可能要对这个过程进行控制。java可以将类声明为serializable,但仍可手工控制声明为static或transient的数据成员。

  例子:一个非常简单的序列化类。

  public class simpleSerializableClass implements Serializable {

  String sToday="Today:" ;

  transient Date dtToday=new Date ();

  }

  序列化时,类的所有数据成员应可序列化除了声明为transient 或static的成员。将变量声明为transient告诉JVM我们会负责将变元序列化。将数据成员声明为transient后,序列化过程就无法将其加进对象字节流中,没有从transient数据成员发送的数据。后面数据反序列化时,要重建数据成员(因为它是类定义的一部分),但不包含任何数据,因为这个数据成员不向流中写入任何数据。记住,对象流不序列化static或transient。我们的类要用writeObject()与 readObject()方法以处理这些数据成员。使用writeObject()与readObject()方法时,还要注意按写入的顺序读取这些数据成员。

  关于如何使用定制序列化的部分代码如下:

  //重写writeObject()方法以便处理transient的成员。

  public void writeObject(ObjectOutputStream outputStream) throws IOException {

  outputStream.defaultWriteObject();//使定制的writeObject()方法可以

  利用自动序列化中内置的逻辑。

  outputStream.writeObject(oSocket.getInetAddress());

  outputStream.writeInt(oSocket.getPort());

  }

  //重写readObject()方法以便接收transient的成员。

  private void readObject(ObjectInputStream inputStream) throws IOException ,

  ClassNotFoundException {

  inputStream.defaultReadObject();//defaultReadObject()补充自动序列化

  InetAddress oAddress=(InetAddress )inputStream.readObject();

  int iPort =inputStream.readInt();

  oSocket = new Socket (oAddress,iPort);

  iID=getID();

  dtToday =new Date ();

  }

  完全定制序列化过程:

  如果一个类要完全负责自己的序列化,则实现Externalizable接口而不是Serializable接口。Externalizable接口定义包括两个方法writeExternal()与readExternal()。利用这些方法可以控制对象数据成员如何写入字节流.类实现 Externalizable时,头写入对象流中,然后类完全负责序列化和恢复数据成员,除了头以外,根本没有自动序列化。这里要注意了。声明类实现 Externalizable接口会有重大的安全风险。writeExternal()与readExternal()方法声明为public,恶意类可以用这些方法读取和写入对象数据。如果对象包含敏感信息,则要格外小心。这包括使用安全套接或加密整个字节流。到此为至,我们学习了序列化的基础部分知识。

33/3<123
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号