【发布时间】:2014-06-07 10:05:28
【问题描述】:
ObjectInputStream is = new ObjectInputStream(new FileInputStream("test.ser"));
TestClass tc = (TestClass)is.readObject();
反序列化后我得到了TestClass的对象,但是没有调用TestClass的默认构造函数。据我了解 有两种方法可以创建对象,即使用 new 运算符或 TestClass.class.newInstance()。两者都调用默认构造函数。
看起来反序列化过程不是使用大约两种方法创建对象,这就是不调用默认构造函数的原因。 问题是反序列化如何创建对象?
另外一点是,如果 TestClass 扩展了 BaseTestClass 并且 BaseTestClass 没有实现序列化, BaseTestClass 的构造函数被调用,但不是 TestClass。为什么这样 ?我相信这背后会有一些合乎逻辑的原因。 但我没听懂?
【问题讨论】:
-
如果类没有默认(非参数)构造函数怎么办?那么应该调用哪个构造函数呢?反序列化过程应该如何决定构造函数是否很少?
-
他们就是这样设计的。除非您得到 JDK 作者的回复,否则您在这里得到的只是或多或少不知情的意见。离题。
-
它是 JAVA 的内部实现,您无需为此烦恼。有兴趣再挖ObjectInputStream#readObject()的源码。
标签: java serialization