0

我怎样才能发送一个Arraylist<java.awt.geom.Area>通过套接字?因为Area它不是Serializable给了一个NotSerializableException有什么办法可以发送吗?

4

2 回答 2

1

为了通过网络连接发送不可序列化的类,您必须自己提供代码来“序列化”它。这意味着设置序列化编码/格式,即将其转换为字符串或二进制表示,编写代码来生成这种格式,以及可以解析字符串/二进制表示并重新创建对象实例的代码。

这意味着您必须有权访问(并在您的字符串/二进制表示中编码)足够的内部状态,以便能够在反序列化时重新创建等效对象。由于java.awt.geom.Area本身不支持序列化,这完全取决于您。

toString()对于一个简单的类,调用序列化并编写一些简单的代码来解析输出字符串以重建等效对象就足够了。如何为复杂的类执行此操作将取决于该类的内部结构,并且可能超出了 SO 所能解释的范围。

因为这可能不是微不足道的,因为它可以代表Area很多不同的类。Shape

于 2013-08-08T18:32:07.823 回答
0

Path2D.Float 和 Path2D.Double 是可序列化的,因此您可以发送其中之一。

发送方:

void writeAreas(List<Area> areas, ObjectOutputStream stream)
throws IOException {
    List<Path2D> paths = new ArrayList<>(areas.size());
    for (Area area : areas) {
        paths.add(new Path2D.Float(area));
    }
    stream.writeObject(paths);
}

接收方:

List<Area> readAreas(ObjectInputStream stream)
throws IOException, ClassNotFoundException {
    List<?> paths = (List<?>) stream.readObject();
    List<Area> areas = new ArrayList<>(paths.size());
    for (Object pathObj : paths) {
        Shape path = (Shape) pathObj;
        areas.add(new Area(path));
    }
    return areas;
}
于 2013-08-09T12:41:05.380 回答