使用ObjectInputStream时,在对象反序列化期间是否调用默认构造函数?

时间:2013-06-16 20:28:35

标签: java serialization

Java新手,我正在使用browxy尝试回答这个问题而且它不允许创建文件。

所以我想知道在下面的代码中,当调用readObject时,它是否调用默认构造函数(如果存在)或不调用? (还有,Java中的MemoryStream(C#)是否相同?)

import java.util.*;
import java.io.*;

public class HelloWorld {
  public static void main(String[] args) {
        System.out.println("Hello World");

        try
        {
            TestClass tc = new TestClass();

            FileOutputStream fos = new FileOutputStream("t.tmp");
                ObjectOutputStream oos = new ObjectOutputStream(fos);
                oos.writeObject(tc);
                oos.close();

                    FileInputStream fis = new FileInputStream("t.tmp");
                    ObjectInputStream ois = new ObjectInputStream(fis);

                    TestClass tcClone = (TestClass)ois.readObject();

                    ois.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }

  }
}

class TestClass implements Serializable
{
    public TestClass()
    {
        System.out.println("TestClass CTOR");
    }
}

2 个答案:

答案 0 :(得分:4)

  

我想知道在下面的代码中,当调用readObject时,   它是否调用默认构造函数(如果存在)或不调用?

不,它没有..

  

Java中是否有等效的MemoryStream(C#)?

ByteArrayInputStreamByteArrayOutputStream

答案 1 :(得分:4)

对于实现java.io.Externalizable的类,将调用public no-arg构造函数。

对于其他可序列化类,将调用派生程度最高的非可序列化基类的可访问no-arg构造函数。可序列化的班级'调用readObject方法就好像是构造函数(或者至少是从调用超级构造函数返回后的构造函数体)。

一个常见的误解是可序列化类需要一个公共的无参数构造函数。他们没有。

java.lang.String和枚举是专门处理的。