Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 序列化点,点F对象_Java_Android_Sockets - Fatal编程技术网

Java 序列化点,点F对象

Java 序列化点,点F对象,java,android,sockets,Java,Android,Sockets,我不熟悉序列化概念,我正在尝试序列化PointF类,因为我需要通过套接字连接发送它(我使用ObjectOutputStream和ObjectInputStream)。我的问题是,无论发送时PointF对象中有什么值,在接收后都会得到默认值 例如,如果发送pointF(1.0,4.0),则得到(0.0,0.0) 下面是我实现serializable的代码 public class MyPointF extends PointF implements Serializable { /** *

我不熟悉序列化概念,我正在尝试序列化PointF类,因为我需要通过套接字连接发送它(我使用ObjectOutputStream和ObjectInputStream)。我的问题是,无论发送时PointF对象中有什么值,在接收后都会得到默认值

例如,如果发送pointF(1.0,4.0),则得到(0.0,0.0)

下面是我实现serializable的代码

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类也发生了这种情况。请纠正我的错误。

您的超类
点f
不可序列化。这意味着以下内容适用:

为了允许序列化不可序列化类的子类型,子类型可以负责保存和恢复超类型的公共、受保护和(如果可访问)包字段的状态。只有当子类型扩展的类具有可访问的无参数构造函数来初始化类的状态时,子类型才可以承担此责任。如果不是这样,则声明类可序列化是错误的。错误将在运行时检测到

在反序列化过程中,不可序列化类的字段将使用该类的public或protected no arg构造函数进行初始化。无参数构造函数必须可被可序列化的子类访问。可序列化子类的字段将从流中恢复

见:

您需要查看
readObject
writeObject

在序列化和反序列化过程中需要特殊处理的类必须使用以下精确签名实现特殊方法:

 private void writeObject(java.io.ObjectOutputStream out)
     throws IOException
 private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;

另请参见此处:了解更多提示和窍门。

我终于找到了解决方案。Thanx@Greg和其他已被删除的评论。解决方案是,我们可以创建存根对象,而不是扩展这些对象。当我从构造函数调用super时,x和y字段是从不可序列化的基类继承的。所以它们没有序列化,也没有发送值

所以我按照你的建议安排了我的课程

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;
}
}

为什么这就足够了?您真的不需要实现
writeObject()
readObject()