假设我有一个Serializable接口,如下所示
public interface SomeInterface extends Serializable {
public SomeClass getSomething(String someParameter);
}
SomeClass
会自动进行序列化吗?
令我们惊讶的是,即使SomeClass
未实现Serializable,我们的RMI应用程序也能正常运行。
为什么会这样?
答案 0 :(得分:2)
SomeClass
会自动Serializable
吗?令我们惊讶的是,即使SomeClass
未实现Serializable
,我们的RMI应用程序也能正常运行。
没有
序列化是关于序列化对象的(非瞬态)状态。某些方法的签名中存在getSomething
并不要求 SomeInterface
实例的状态以包含SomeClass
实例。
可以实现该方法以返回新创建的SomeClass
,transient
字段的值,在其他类上调用static
方法的结果,或者...... 。null
。
答案 1 :(得分:0)
不,默认情况下,在可序列化的类中引用的任何类都不可序列化。
理想情况下,java
应该抛出NotSerializableException
,但由于您未获得异常,因此SomeClass
extends Serializable
位于其父级层次结构中。
答案 2 :(得分:-1)
不,SomeClass
不会是Serializable
,因为此界面会延伸Serializable
。
Serializable
适用于对象的状态,这里没有任何暗示SomeClass是SomeInterface状态的一部分。
https://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html
你是在起诉SomeClass
被反序列化的时候,它并没有扩展实现Serializable
的类吗?
答案 3 :(得分:-1)
假设SomeInterface
的实现只是做与
public class SomeInterfaceImpl implements SomeInterface {
@Override
public SomeClass getSomething(String someParameter) {
return new SomeClass(someParameter);
}
}
当SomeInterfaceImpl
的对象刚刚动态创建时,为什么您的程序在序列化SomeClass
对象时失败?
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Main {
public static void main(String[] args) {
try (final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
final ObjectOutputStream out = new ObjectOutputStream(byteArrayOutputStream)) {
final SomeInterfaceImpl someInterfaceImpl = new SomeInterfaceImpl();
final SomeClass something1 = someInterfaceImpl.getSomething("Test");
out.writeObject(someInterfaceImpl);
try (final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
final ObjectInputStream in = new ObjectInputStream(byteArrayInputStream)) {
final SomeInterface someInterface = (SomeInterface) in.readObject();
final SomeClass something2 = someInterface.getSomething("Test");
final String someParameter1 = something1.getSomeParameter();
System.out.println(someParameter1);
final String someParameter2 = something2.getSomeParameter();
System.out.println(someParameter2);
} catch (ClassNotFoundException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}