通过socket </java.awt.geom.area读/写Arraylist <java.awt.geom.area>

时间:2013-08-08 18:15:45

标签: java

如何通过套接字发送Arraylist<java.awt.geom.Area>? 因为Area不是Serializable,它会给NotSerializableException提供任何方式吗?

2 个答案:

答案 0 :(得分:1)

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

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

对于一个简单的类,只需调用toString()来序列化并编写一些简单的代码来解析该输出字符串以重建一个等效的对象就足够了。如何为复杂的类做这将取决于类的内部,可能超出了可以在SO上解释的内容。

对于Area,这可能并不重要,因为它可以代表许多不同的Shape类。

答案 1 :(得分: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;
}