从子/子/继承类获取基类/父级/超级类

问题描述:

我想通过套接字发送对象列表。从子/子/继承类获取基类/父级/超级类

列表中的对象包含一个不可序列化的对象,因此无法发送,但它的基类是完全可序列化的并包含我需要的所有字段。

所以我想要做的是将列表转换为基类列表。我认为这样做的唯一方法如下:

// subClassList is an ArrayList<SubClass> 
ArrayList<BaseClass> baseClassList = new ArrayList<BaseClass>(); 
for(SubClass subClass: subClassList) { 
    // cast to the base class 
    baseClassList.add((BaseClass)subClass); 
} 

但是这并不起作用,因为我仍然得到相同的NotSerializableException异常。从调试代码我可以看到,新列表仍然是子类的列表,即使它已经被转换。

有没有办法实现我想要做的?

铸造参考并不改变实际对象的类型:如果你想只

String foo = "hello"; 
Object bar = (Object) foo; 
System.out.println(bar); // Hello 
System.out.println(bar.getClass()); // java.lang.String 

有基类的一个实例,您可以创建在基类的构造函数,其简单地创建给它的一个实例,基类的新实例,而不试图履行任何形式的深副本:在你以前做的代码显示

public BaseClass(BaseClass other) { 
    this.x = other.x; 
    this.y = other.y; 
    this.z = other.z; 
    // etc 
} 

然后N:

baseClass.add(new BaseClass(subClass)); 

你的方法是行不通的,因为即使你可以使用一个超类变量引用子类对象,对象本身是子类类型的。

最好的方法是序列化子类,或从子类中提取数据并将它们写入新创建的超类。只需要一个静态的实用工具方法来进行转换构建到子类中...

铸造不会更改对象的类型。它允许获取对象的另一种类型的引用,如果对象具有这种其他类型。上传不是必需的。您可以使用

String s = "hello"; 
Object o = s; // no cast needed 

向下转换是必要的,只会工作,如果对象的类型,你将它转换为:

Object o = "hello"; 
Object o2 = Integer.valueOf(5); 
String s = (String) o; // OK because o is a String 
String s2 = (String) o2; // ClassCastException, because o2 is not a String. 

所以,你的代码就相当于

ArrayList<BaseClass> baseClassList = new ArrayList<BaseClass>(); 
for(SubClass subClass: subClassList) { 
    // cast to the base class 
    baseClassList.add(subClass); 
} 

您必须使用复制构造函数创建新类型的新对象:

ArrayList<BaseClass> baseClassList = new ArrayList<BaseClass>(); 
for(SubClass subClass: subClassList) { 
    // cast to the base class 
    baseClassList.add(new BaseClass(subClass)); 
} 

你的问题体现了矛盾的条款。如果基类是可序列化的,那么它的所有派生类。如果您的派生类包含对不可序列化对象的引用,只需让它们为瞬态即可。