[英]NotSerializableException with java.awt.geom.Area
[英]Read/Write Arraylist<java.awt.geom.Area> through socket
如何通过套接字发送Arraylist<java.awt.geom.Area>
? 因为Area
不可Serializable
所以它给出了NotSerializableException
是否有任何发送方法?
为了通过网络连接发送不可序列化的类,您必须提供代码以自己对其进行“序列化”。 这意味着设置序列化编码/格式,即将其转换为String或二进制表示形式,编写代码以产生该格式,还编写可解析String / binary表示形式并重新创建对象实例的代码。
这意味着您必须具有足够的内部状态(并在您的String /二进制表示中进行编码),才能在反序列化时重新创建等效对象。 由于java.awt.geom.Area
本身不支持序列化,因此一切都取决于您。
对于一个简单的类,调用toString()
进行序列化并编写一些简单的代码来解析该输出字符串以重建等效对象可能就足够了。 对于复杂的类,如何执行此操作将取决于类的内部,并且可能超出SO所能解释的范围。
对于Area
这可能并非易事,因为它可以表示很多不同的Shape
类。
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.