我正在编写一个程序,其中对象被序列化为名为“Books.ser”的文档
FileOutputStream fos = new FileOutputStream("Books.ser");
ObjectOutputStream os = new ObjectOutputStream(fos);
for (int i = 1; i < 1000; i++) {
os.writeObject(shelf.book[i]);
}
os.close();
有没有办法打开并查看此文档? 如果不是,我只是想知道Java序列化尚未初始化的对象。 (null)
答案 0 :(得分:1)
嗯,相反的循环应该这样做。
FileInputStream is = new FileInputStream("Books.ser");
ObjectInputStream ois = new ObjectInputStream(is);
for (int i = 1; i < 1000; i++) {
Object o = os.readObject();
// Do something with o - e.g. add to a List
}
ois.close();
来自JavaDoc:
ObjectOutputStream将Java对象的原始数据类型和图形写入OutputStream。可以使用ObjectInputStream读取(重构)对象。可以通过使用流的文件来完成对象的持久存储。
所以,基本上你用writeInt
写基元(例如writeObject
)或对象(ObjectOutputStream
),然后用ObjectInputStream
和相应的{read
读回它们。 {1}}。 - 方法
如果OutputStream知道要序列化的Object的类型,也可以使用空值。 E.g。
public static class MyClass implements Serializable {
private final String content;
public MyClass(final String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
@Test
public void testWriteObject() throws IOException, ClassNotFoundException {
MyClass nullInstance = null;
MyClass notNullInstance = new MyClass("This content is not null");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream os = new ObjectOutputStream(baos)) {
os.writeObject(nullInstance);
os.writeObject(notNullInstance);
}
try (ObjectInputStream is =
new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))) {
MyClass shouldBeNull = (MyClass) is.readObject();
MyClass shouldNotBeNull = (MyClass) is.readObject();
Assert.assertNull(shouldBeNull);
Assert.assertNotNull(shouldNotBeNull);
// Attributes are serialized too
Assert.assertEquals("This content is not null", shouldNotBeNull.getContent());
}
}
使用InputStream
和OutputStream
类时,建议使用try-with-resources构造(来自Java 7)。
try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("Books.ser"))) {
// loop and serialize...
} catch (IOException e) {
// Handle exception
}