【问题标题】:Serialize a java.awt.geom.Area序列化 java.awt.geom.Area
【发布时间】:2011-02-08 07:21:25
【问题描述】:

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

提前致谢

【问题讨论】:

    标签: java serialization geometry awt area


    【解决方案1】:

    使用XStream 将其与 XML 进行简单的转换。您不需要您的对象来实现特定的接口,并且序列化是可定制的。

    【讨论】:

    • 感谢您的回复。不幸的是,我无法发送太多信息,因此我无法提供 XML。
    【解决方案2】:

    我找到了这个解决方法:

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

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

    【讨论】:

      【解决方案3】:

      从 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()));
          }
      }
      

      【讨论】:

        【解决方案4】:

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

        您所要做的就是将Area 对象转换为Path2D.Double(或Path2D.Float)对象(即Serializable)及其对应的append 方法,同时还要考虑到构建时间(甚至更晚,有相应的设置器存在)。

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

        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.
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-23
          • 1970-01-01
          • 2016-10-07
          • 1970-01-01
          • 1970-01-01
          • 2012-09-07
          • 2018-11-10
          • 2011-08-10
          相关资源
          最近更新 更多