如果在Serializable接口中使用Java,是否会自动生成Serializable类?

时间:2016-11-08 15:35:13

标签: java serialization

假设我有一个Serializable接口,如下所示

public interface SomeInterface extends Serializable {

     public SomeClass getSomething(String someParameter);

}

SomeClass会自动进行序列化吗? 令我们惊讶的是,即使SomeClass未实现Serializable,我们的RMI应用程序也能正常运行。

为什么会这样?

4 个答案:

答案 0 :(得分:2)

  

SomeClass会自动Serializable吗?令我们惊讶的是,即使SomeClass未实现Serializable,我们的RMI应用程序也能正常运行。

没有

序列化是关于序列化对象的(非瞬态)状态。某些方法的签名中存在getSomething并不要求 SomeInterface实例的状态以包含SomeClass实例。

可以实现该方法以返回新创建的SomeClasstransient字段的值,在其他类上调用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对象时失败?

最小示例

Main.java

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);
        }
    }
}