![](/img/trans.png)
[英]NotSerializableException with 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.