我正在寻找一种方法将Java中的类序列化为它的超类,然后将其转换为字节数组并通过网络发送。
以下是一个例子:
class SuperClass {
public int number1;
}
class SubClass extends SuperClass {
public int number2;
}
我不认为简单地将SubClass的对象强制转换为SuperClass然后序列化它,或者我错了?是否有某种方法可以执行此“转换”而无需手动将所有继承的值从SubClass复制到新的SuperClass?
编辑:嗯,我意识到自己是按照我原来的想法自己拍摄的,所以我决定做的只是序列化SubClass,并在网络连接的两侧使用它。这是最简单的事情,我不必担心转换和继承。答案 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:
如果接收序列化对象的另一端的程序尚未加载已接收对象的类,那么您将获得异常。
这就是为什么你需要执行后续步骤才能传输未知子类的对象:
将对象及其name
的类转移到另一侧。
在另一方加载转移的课程(即Class.forName (classname)
)。
现在发送对象。
最困难的部分是第一步。想想怎么做。我现在没有必要的例子,但如果你在那之前找不到解决方案,我可能会发布后者。