簡體   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