我是序列化概念的新手,我正在尝试序列化PointF类,因为我需要通过套接字连接发送它(我正在使用ObjectOutputStream和ObjectInputStream)。我的问题是在发送时,无论我的PointF对象发送了什么值,在收到默认值后都会发送。
例如,如果我发送了pointF(1.0,4.0),我得到(0.0,0.0)。
以下是我的可串行化代码。
public class MyPointF extends PointF implements Serializable {
/**
*
*/
private static final long serialVersionUID = -455530706921004893L;
public MyPointF() {
super();
}
public MyPointF(float x, float y) {
super(x, y);
}
}
有人可以指出问题吗? 另外,搜索了一下后我发现这个东西也发生在android.canvas.Path类中。请纠正我错在哪里。
答案 0 :(得分:1)
您的超类PointF
不可序列化。这意味着以下情况适用:
为了允许序列化非可序列化类的子类型,子类型可能负责保存和恢复超类型的public,protected和(如果可访问)包字段的状态。只有当它扩展的类具有可访问的no-arg构造函数来初始化类的状态时,子类型才可以承担此责任。如果不是这种情况,则声明类Serializable是错误的。将在运行时检测到错误。
在反序列化期间,将使用类的public或protected no-arg构造函数初始化非可序列化类的字段。必须可以对可序列化的子类访问no-arg构造函数。可序列化子类的字段将从流中恢复。
请参阅:http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html
您需要查看readObject
和writeObject
:
在序列化和反序列化过程中需要特殊处理的类必须使用这些精确签名实现特殊方法:
private void writeObject(java.io.ObjectOutputStream out) throws IOException private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
另请参阅此处:Java Serialization with non serializable parts了解更多提示和技巧。
答案 1 :(得分:0)
我终于找到了解决方案。 Thanx @Greg和其他已被删除的评论。解决方案是,我们可以创建存根对象,而不是扩展这些对象。当我从构造函数调用super时,x和y字段继承自不可序列化的基类。所以它们没有被序列化,并且没有发送值。
所以我根据你的建议对我的班级进行了mofidfied
public class MyPointF implements Serializable {
/**
*
*/
private static final long serialVersionUID = -455530706921004893L;
public float x;
public float y;
public MyPointF(float x, float y) {
this.x = x;
this.y = y;
}
}