3

我需要在套接字中序列化一个区域对象(java.awt.geom.Area)。但是它似乎不是可序列化的。有没有办法做这样的事情?也许通过将其转换为不同的对象?

提前致谢

4

4 回答 4

6

我找到了这个解决方法:

AffineTransform.getTranslateInstance(0,0).createTransformedShape(myArea)

这会产生一个可以序列化的形状。

于 2011-11-21T17:39:37.173 回答
1

使用XStream轻松地将其转换为 XML 或从 XML 转换。您不需要您的对象来实现特定的接口,并且序列化是可定制的。

于 2010-04-15T09:42:52.420 回答
0

由于 Java 1.6 似乎有一种更正式的方式来执行此操作。

您所要做的就是使用相应的方法将Area对象转换为Path2D.Double(或Path2D.Float)对象(即) ,同时还要考虑构造时的缠绕规则(或者甚至稍后,使用存在的相应设置器)。Serializableappend

要从 to 转换Path2D.DoubleArea只需使用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.
    }
}
于 2020-02-28T12:53:04.850 回答
0

从 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()));
    }
}
于 2015-12-29T16:07:41.017 回答