序列化java.awt.geom.Area

时间:2010-04-15 09:41:57

标签: java serialization geometry awt area

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

提前致谢

4 个答案:

答案 0 :(得分:6)

我发现了这个解决方法:

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

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

答案 1 :(得分:1)

使用XStream将其转换为XML或从XML转换。您不需要对象来实现特定接口,并且可以自定义序列化。

答案 2 :(得分: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()));
    }
}

答案 3 :(得分:0)

由于Java 1.6似乎有一种更正式的方式来做到这一点。

所有您需要做的就是将Area对象转换为Path2D.Double对象(即Path2D.Float)及其相应的Serializable对象方法,同时还要考虑到施工时(甚至更晚的时候,存在相应的二传手)的绕线规则。

要从append转换为Path2D.Double,只需使用Area的构造函数,该构造函数接受Area

Shape