我需要在套接字中序列化一个区域对象(java.awt.geom.Area)。但是它似乎不是可序列化的。有没有办法做这样的事情?也许通过将其转换为不同的对象?
提前致谢
我需要在套接字中序列化一个区域对象(java.awt.geom.Area)。但是它似乎不是可序列化的。有没有办法做这样的事情?也许通过将其转换为不同的对象?
提前致谢
我找到了这个解决方法:
AffineTransform.getTranslateInstance(0,0).createTransformedShape(myArea)
这会产生一个可以序列化的形状。
使用XStream轻松地将其转换为 XML 或从 XML 转换。您不需要您的对象来实现特定的接口,并且序列化是可定制的。
由于 Java 1.6 似乎有一种更正式的方式来执行此操作。
您所要做的就是使用相应的方法将Area
对象转换为Path2D.Double
(或Path2D.Float
)对象(即) ,同时还要考虑构造时的缠绕规则(或者甚至稍后,使用存在的相应设置器)。Serializable
append
要从 to 转换Path2D.Double
,Area
只需使用Area
接受 a 的 's 构造函数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.
}
}
从 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()));
}
}