首页 / 软件开发 / JAVA / 剖析使用ObjectOutputStream可能引起的内存泄漏
剖析使用ObjectOutputStream可能引起的内存泄漏2012-01-28 IBM 李锬使用 ObjectOutputStream 来进行对象序列化相信大多数程序员在使用 Java 进行日常开发工作中,都曾经遇到需要把数据进行序列化的情况,比如写入文件或者写入 socket 流。Java 的类库也提供了丰富工具类供我们使用,这其中就包括 ObjectOutputStream。此类允许我们将 Java 对象的基本数据类型和图形写入 OutputStream,在需要将 Java 对象进行序列化操作时,使用该类可以极大为我们提供便利。但是使用不当也会引起一些麻烦。需要说明的是,在使用 ObjectOutputStream 向 OutputStream 流中写入的时候会在流中添加写入 Object 的信息。这样的话在我们使用 ObjectOutputStream 编写跨语言的 Socket 通信时会遇到问题。因为数据流中加入的是 Java 特有的信息,如 Class 类型以及成员变量的类型信息,只有使用 ObjectInputStream 才能解析这些特定的信息。好了,通过上面的说明,我们现在对 ObjectOutputStream 有了一个大体的了解,接下来我们使用具体的代码来看一下如果使用 ObjectOutputStream 来把对象序列化到对象中。把 Java 对象序列化到文件中首先我们有一个简单的 Java 对象类:清单 1. 要序列化的 java 对象class MyObject implements Serializable {
private static final long serialVersionUID = -9163423175612080544L;
String str1;
String str2;
}接下来我们使用 ObjectOutputStream 把 MyObject 对象写入文件:清单 2. 写入文件FileOutputStream fos = new FileOutputStream("c:\test.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
MyObject myObj = new MyObject();
myObj.str1 = "test1";
myObj.str2 = "test2";
oos.writeObject(myObj);
fos.close();我们来看一下写入文件的内容:清单 3. 写入文件内容#sr #com.travelsky.test.MyObject €喳 +?^`# #L #str1t #Ljava/lang/String;L #str2q ~
#xpt #test1t #test2我们可以看到写入的内容中包含了写入类的类型以及成员变量信息,当然关于插入的内容,我们可以覆盖 ObjectOutputStream 类的 writeStreamHeader() 方法来实现插入我们自定义的内容。当然如果这样做的话,就必须对 ObjectInputStream 类进行重写。