如果在序列化之前对象是upcast,那么序列化如何在Java中工作?

时间:2011-10-23 05:08:47

标签: java serialization rmi

说我有一个界面和一个对象:

public interface MyInterface {
    public String getStringOne();
}

public class MyObject implements MyInterface {
    private final String stringOne = "string1";
    private final Image myGiganticImage; // loads from disk in the constructor

    // Getters for both would follow
}

如果我在通过网络发送MyObject之前将其转发到MyInterface,会传输什么?

public class MyService {
    private final MyObject data = new MyObject();

    public MyInterface getData() {
        return data;
    }
}

具体来说,myGiganticImage是否通过电汇发送?

3 个答案:

答案 0 :(得分:5)

显然MyObject的状态是序列化的。 public MyInterface getData()只是强制getData()返回的类型是MyInterface

答案 1 :(得分:1)

向上转换不会改变对象的内容。

答案 2 :(得分:0)

向上转换只是一种改变指针类型的方法。无论指针类型如何,JVM堆上都保留相同的数据结构。这种结构实际上并不关心你指向它的方式。

当您序列化对象系统(可能)时,会询问您的对象是否为类(getClass()),然后使用反射读取此类中的所有字段。 即使您使用 Object 指向它,对象也会始终报告其类。

系统将始终从类中读取字段,因为它是java获取字段列表的唯一方法:向对象请求类,而不是向类请求字段。

如果您想转移对象的父级,您可以尝试我的解决方案:Deserialize remote object to the narrowest accessible class