[英]NotSerializableException with java.awt.geom.Area
[英]Serialize a java.awt.geom.Area
我需要在套接字中序列化一个 Area 对象(java.awt.geom.Area)。 但是它似乎不可序列化。 有没有办法做这样的事情? 也许通过将其转换为不同的对象?
提前致谢
我找到了这个解决方法:
AffineTransform.getTranslateInstance(0,0).createTransformedShape(myArea)
这导致可以序列化的形状。
使用XStream将其简单地转换为 XML 或从 XML 转换。 您不需要对象来实现特定的接口,并且序列化是可定制的。
从 kieste 的回答中,可以推导出这种变通方法。
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;
import java.io.IOException;
import java.io.Serializable;
public class SerialArea extends Area implements Serializable {
private static final long serialVersionUID = -3627137348463415558L;
/**
* New Area
*/
public SerialArea() {}
/**
* New Area From Shape
*/
public SerialArea(Shape s) {
super(s);
}
/**
* Writes object out to out.
* @param out Output
* @throws IOException if I/O errors occur while writing to the
* underlying OutputStream
*/
private void writeObject(java.io.ObjectOutputStream out)
throws IOException {
out.writeObject(AffineTransform.getTranslateInstance(0, 0).
createTransformedShape(this));
}
/**
* Reads object in from in.
* @param in Input
* @throws IOException if I/O errors occur while writing to the
* underlying OutputStream
* @throws ClassNotFoundException if the class of a serialized object
* could not be found.
*/
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException {
add(new Area((Shape) in.readObject()));
}
}
由于 Java 1.6 似乎有一种更正式的方法来执行此操作。
您所要做的就是使用相应的append
方法将Area
对象转换为Path2D.Double
(或Path2D.Float
)对象(它是Serializable
),同时还要考虑到构造时的缠绕规则(或者甚至以后,使用存在的相应设置器)。
要将Path2D.Double
转换为Area
,只需使用Area
接受Shape
的构造函数。
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Path2D;
import java.awt.geom.PathIterator;
import java.awt.geom.Rectangle2D;
public class SerializeArea {
public static Path2D.Double toPath2D(final Area a) {
final PathIterator pi = a.getPathIterator(new AffineTransform());
final Path2D.Double path = new Path2D.Double();
switch (pi.getWindingRule()) {
case PathIterator.WIND_EVEN_ODD: path.setWindingRule(Path2D.WIND_EVEN_ODD); break;
case PathIterator.WIND_NON_ZERO: path.setWindingRule(Path2D.WIND_NON_ZERO); break;
default: throw new UnsupportedOperationException("Unimplemented winding rule.");
}
path.append(pi, false);
return path;
}
public static Area toArea(final Path2D path) {
return new Area(path);
}
public static void main(final String[] args) {
final Area area = new Area(new Ellipse2D.Double(0, 0, 100, 100));
area.intersect(new Area(new Rectangle2D.Double(0, 25, 100, 50))); //Creating something like a capsule.
System.out.println(toArea(toPath2D(area)).equals(area)); //Prints true.
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.