在Java中序列化对象的超类
我正在寻找一种方法,将Java中的类序列化为其超类,然后将其转换为字节数组并通过网络发送 以下是一个例子:在Java中序列化对象的超类,java,serialization,casting,Java,Serialization,Casting,我正在寻找一种方法,将Java中的类序列化为其超类,然后将其转换为字节数组并通过网络发送 以下是一个例子: class SuperClass { public int number1; } class SubClass extends SuperClass { public int number2; } 我认为不可能简单地将子类的对象转换成超类,然后序列化它,或者我错了吗?是否有某种方法可以实现这种“转换”,而不必手动将所有继承的值从子类复制到新的超类 编辑:嗯,我意识到我用
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的类,只知道超类。我试着从一个子类转换到一个超类,虽然效果不错,但对象仍然是一个子类。我想将子类的对象转换为超类,然后序列化它。啊,现在清楚了。将此评论添加到您的问题中。你需要另一种方法。我将尝试更新我的答案,但我现在没有太多时间。