序列化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

我需要在套接字中序列化Area对象(java.awt.geom.Area)。但是,它似乎不可序列化。有没有办法做到这一点?也许把它转换成另一个物体


提前感谢

用于将其转换为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。