繁体   English   中英

序列化一个 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM