在Java中序列化对象的超类

时间:2010-02-26 17:05:20

标签: java serialization casting

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

以下是一个例子:

class SuperClass {
    public int number1;
}

class SubClass extends SuperClass {
    public int number2;
}

我不认为简单地将SubClass的对象强制转换为SuperClass然后序列化它,或者我错了?是否有某种方法可以执行此“转换”而无需手动将所有继承的值从SubClass复制到新的SuperClass?

编辑:嗯,我意识到自己是按照我原来的想法自己拍摄的,所以我决定做的只是序列化SubClass,并在网络连接的两侧使用它。这是最简单的事情,我不必担心转换和继承。

3 个答案:

答案 0 :(得分:1)

在OO的概念中:“SubClass” 始终是“SuperClass”。所以没有必要进行转换/复制/转换。只需将其用作SuperClass。

答案 1 :(得分:0)

  

我认为不可能简单地将SubClass的对象强制转换为SuperClass然后将其序列化

你有没有试过......这是最简单的方法,看看是否有可能......

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

答案 2 :(得分:0)

我认为你的标题的措辞不是你真正想要的。

  

我正在寻找一种在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
   }
}

您可以使用上面的代码对象进行传输,这些对象是SuperClass或其任何子类的实例。但是,如果在一个子类型中,您只想传输一个对象的一部分而其余部分应该设置为“在另一侧”,那么您应该将方法readObject ()writeObject ()添加到该超类。阅读一些有关序列化的教程以获取更多详细信息(link)。

UPD:

如果接收序列化对象的另一端的程序尚未加载已接收对象的类,那么您将获得异常。

这就是为什么你需要执行后续步骤才能传输未知子类的对象:

  1. 将对象及其name的类转移到另一侧。

  2. 在另一方加载转移的课程(即Class.forName (classname))。

  3. 现在发送对象。

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