0

我的 SuperYo 类扩展了 Persona 类,如下所示:

public class SuperYo extends Persona {

   private NotSerializableObj obj1
   private NotSerializableObj obj2
   private NotSerializableObj obj3

}

public class Persona {

   private SerializableObj sObj1
   private SerializableObj sObj2
   private SerializableObj sObj3

}

问题是,我将 SuperYo 的 Persona 实例添加到 LinkedList:

LinkedList<Persona> list = new LinkedList<Persona>();
list.add((Persona) superYo);

它将它添加为 SuperYo 对象!上面有所有 NonSerializableObjs ......因此,不能从 Socket 发送:(。

所以,问题是......有没有办法将一个对象“向下转换”到它的父类,所以它的属性不存在?

谢谢!

4

2 回答 2

0

铸造是多态性的问题。当您将 type1 的对象转换为 type2 时,实例不会改变,但您只是从新的角度看待实例!

如果要通过网络发送子类,可以将 SuperYo 成员设置为瞬态,并在实例化时填充它们。或者您可以将 writeObject() 和 readObject() 方法添加到您的子类。

于 2012-11-03T00:50:50.917 回答
0

实施如下:readObject_writeObjectSuperYo

 private void writeObject(ObjectOutputStream outStream) throws IOException {
    //write attributes from PersonYo only
    outStream.defaultWriteObject();
    outStream.writeObject(sObj1);
    outStream.writeObject(sObj2);
    outStream.writeObject(sObj2);
 }

private void readObject(ObjectInputStream inStream) throws IOException,
                                                          ClassNotFoundException {
    //read attributes from PersonYo only
    inStream.defaultReadObject();
    sObj1= (SerializableObj)inStream.readObject();
    sObj2= (SerializableObj)inStream.readObject();
    sObj3= (SerializableObj)inStream.readObject();
}

一旦你这样做了,就不需要向下转换了。此外,您可能可以更好地控制对象中的其他不可序列化属性。

于 2012-11-03T00:55:10.900 回答