[英]Does Java make classes Serializable automatically if used in a Serializable interface?
假设我有一个Serializable接口,如下所示
public interface SomeInterface extends Serializable {
public SomeClass getSomething(String someParameter);
}
SomeClass
可以自动序列化? 令我们惊讶的是,即使SomeClass
没有实现Serializable,我们的RMI应用程序也可以正常运行。
为什么是这样?
SomeClass
可以自动Serializable
? 令我们惊讶的是,即使SomeClass
没有实现Serializable
,我们的RMI应用程序也可以正常运行。
没有。
序列化是关于序列化对象的(非瞬态)状态。 某些方法的签名中存在getSomething
并不要求 SomeInterface
实例的状态包含SomeClass
实例。
该方法可以实现为返回新创建的SomeClass
, transient
字段的值,在某个其他类上调用static
方法的结果或.... null
。
否,默认情况下,在可序列化的类中引用的任何类都不可序列化。
理想情况下, java
应该抛出NotSerializableException
,但是由于您没有获得异常方法,因此SomeClass
通过其父层次结构在某处extends Serializable
。
不, SomeClass
不能仅因为此接口扩展了Serializable
而可以Serializable
Serializable
。
Serializable
适用于对象的状态,此处没有任何内容暗示SomeClass是SomeInterface状态的一部分。 https://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html
您是否要求在对SomeClass
进行反序列化时不扩展实现Serializable
的类?
假设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);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.