查看对象序列化的文档

时间:2014-12-27 19:10:11

标签: java serialization

我正在编写一个程序,其中对象被序列化为名为“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)

1 个答案:

答案 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());
    }
}

使用InputStreamOutputStream类时,建议使用try-with-resources构造(来自Java 7)。

try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("Books.ser"))) {
    // loop and serialize...
} catch (IOException e) {
    // Handle exception
}