Java中的对象的Serialize超类

问题描述:

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

下面是一个例子:

class SuperClass { 
    public int number1; 
} 

class SubClass extends SuperClass { 
    public int number2; 
} 

我不认为这是可以简单地投子类的对象转换成父类,然后将其序列化,还是我错了?有没有办法做到这一点“转换”,而不必手动将所有从一个SubClass继承的值复制到一个新的SuperClass?

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

+0

我不完全明白。你想在网络的另一端“补水”什么?一个SuperClass实例? – helios 2010-02-26 17:38:24

+0

你在寻找'writeReplace'(并实现'Serializable'')吗?尽管几乎可以肯定的是“更喜欢构图而不是继承”。 – 2010-02-26 18:08:47

我不认为这是可以简单地投子类的对象转换成父类,然后序列化

你有没有尝试过呢......那是最简单的方法,看看什么是可能的...

如果您想获取序列化对象的字节数组,Serialise为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()添加到该超类。阅读一些关于序列化的教程以获取更多详细信息(link)。

UPD:

如果上连载接收对象不加载已收到的类对象,那么你会得到一个异常对方程序。

这就是为什么你需要为了传输未知sublass的对象进行下一个步骤:

  1. 转移对象的类别及其name到另一边。

  2. 在另一侧装载转移的类(即Class.forName (classname))。

  3. 现在发送该对象。

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

+0

嗯,是的,但另一端的客户端不知道名为SubClass的类,只有SuperClass。我试图从SubClass转换为SuperClass,它可以工作,但对象仍然是一个子类。我想将SubClass的一个对象转换为SuperClass,然后序列化它。 – Bevin 2010-02-26 17:39:32

+0

啊,现在很清楚。将此评论添加到您的问题。你需要另一种方法。我会尽力更新我的答案,但我现在没有太多时间。 – Roman 2010-02-26 17:46:37

在OO的概念中:“子类”总是“超级类”。所以不需要投射/复制/转换。只需使用它作为SuperClass。