在Java中序列化对象的超类

在Java中序列化对象的超类,java,serialization,casting,Java,Serialization,Casting,我正在寻找一种方法,将Java中的类序列化为其超类,然后将其转换为字节数组并通过网络发送 以下是一个例子: class SuperClass { public int number1; } class SubClass extends SuperClass { public int number2; } 我认为不可能简单地将子类的对象转换成超类,然后序列化它,或者我错了吗?是否有某种方法可以实现这种“转换”,而不必手动将所有继承的值从子类复制到新的超类 编辑:嗯,我意识到我用

我正在寻找一种方法,将Java中的类序列化为其超类,然后将其转换为字节数组并通过网络发送

以下是一个例子:

class SuperClass {
    public int number1;
}

class SubClass extends SuperClass {
    public int number2;
}
我认为不可能简单地将子类的对象转换成超类,然后序列化它,或者我错了吗?是否有某种方法可以实现这种“转换”,而不必手动将所有继承的值从子类复制到新的超类

编辑:嗯,我意识到我用我最初想到的方式做这件事是在伤害我自己,所以我决定做的只是序列化子类,并在网络连接的两侧使用它。这是最简单的事情,我不必担心演员和继承

我认为不可能简单地将子类的对象强制转换为超类,然后序列化它

你试过了吗。。。这是看事情是否可能的最简单方法


如果您想为序列化对象获取字节数组,请将其序列化为ByteArrayOutputStream。

我认为标题的措词不是您真正想要的

我正在寻找一种用Java[…]序列化类并通过网络发送的方法

上述问题听起来更现实

你需要这样的东西:

public class SuperClass implements Serializable {
   ...
}

public class Messenger {
   ...

   public void send (SuperClass obj) {
       ObjectOutputStream oos = new ObjectOutputStream (socket.getOutputStream ());
       oos.writeObject (obj);
       oos.close ();
   }

   public SuperClass receive () {
      //some work with ServerSocket#accept() should be here
   }
}
您可以使用以上代码对象进行传输,这些对象是超类或其任何子类的实例。但是,如果在其中一个子类型中,您只想传输对象的一部分,而其余部分应该设置为“在另一端”,那么您应该向该超类添加方法
readObject()
writeObject()
。有关详细信息,请阅读一些有关序列化的教程()

UPD:

若接收序列化对象的另一端的程序尚未加载所接收对象的类,那个么您将得到一个异常

这就是为什么您需要执行以下步骤以传输未知子类的对象:

  • 将对象的类及其
    名称
    转移到另一侧

  • 在另一侧加载传输的类(即
    class.forName(classname)

  • 现在发送对象


  • 最困难的部分是第一步。想想怎么做。我现在没有必要的例子,但如果你在那之前自己找不到解决方案,我可能会在后面发布。

    在面向对象的概念中:“子类”始终是一个“超类”。因此,不需要强制转换/复制/转换。把它当作超类使用。

    我不太明白。您希望在网络的另一端“重新水化”什么?超类实例?您是否正在寻找
    writeReplace
    (并实现
    Serializable
    )?虽然几乎可以肯定的是“更喜欢组合而不是继承”。是的,但是另一端的客户端不知道名为SubClass的类,只知道超类。我试着从一个子类转换到一个超类,虽然效果不错,但对象仍然是一个子类。我想将子类的对象转换为超类,然后序列化它。啊,现在清楚了。将此评论添加到您的问题中。你需要另一种方法。我将尝试更新我的答案,但我现在没有太多时间。