序列化java.awt.geom.Area
我需要在套接字中序列化Area对象(java.awt.geom.Area)。但是,它似乎不可序列化。有没有办法做到这一点?也许把它转换成另一个物体序列化java.awt.geom.Area,java,serialization,geometry,awt,area,Java,Serialization,Geometry,Awt,Area,我需要在套接字中序列化Area对象(java.awt.geom.Area)。但是,它似乎不可序列化。有没有办法做到这一点?也许把它转换成另一个物体 提前感谢用于将其转换为XML或从XML转换为XML。您不需要对象来实现特定的接口,序列化是可定制的。我发现了以下解决方法: AffineTransform.getTranslateInstance(0,0).createTransformedShape(myArea) 这将产生一个可以序列化的形状。根据kieste的回答,可以派生出这种解决方法 i
提前感谢用于将其转换为XML或从XML转换为XML。您不需要对象来实现特定的接口,序列化是可定制的。我发现了以下解决方法:
AffineTransform.getTranslateInstance(0,0).createTransformedShape(myArea)
这将产生一个可以序列化的形状。根据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()));
}
}
因为Java1.6似乎有一种更正式的方法来实现这一点 您所要做的就是将
区域
对象转换为路径2D.Double
(或路径2D.Float
)对象(它是可序列化的
)及其相应的追加
方法,同时考虑构造时的缠绕规则(甚至更晚,使用存在的相应设置器)
要从Path2D.Double
转换到Area
,只需使用Area
的构造函数,该构造函数接受形状
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.
}
}
谢谢你的回复。不幸的是,我不能发送太多的信息,因此我不能支持XML。