0

draw2dLayeredPanesのシリアル化についてサポートが必要です。シリアル化について読んだところ、クラスはSerializableインターフェイスを実装している場合にのみシリアル化でき、そのすべてのフィールドはそれ自体がシリアル化可能または一時的であることがわかりました。

シリアル化する必要のある非常に複雑な図がありますが、どのように進めるかについての手がかりがありませんか?LayeredPaneクラスにはList型のフィールドが1つしか含まれていないことがわかりました。いずれにせよ、LayeredPaneオブジェクトをシリアル化可能にするために、再帰的なメソッドなどを作成する方法を誰かが手助けできますか?

@mKorbel非常に大規模なアプリケーションの一部であるため、私が直面している問題のサンプルシナリオを提供するのは困難です。それでも、私はあなたに問題の考えを与えるかもしれないケースを作りました:

public class Editor extends org.eclipse.ui.part.EditorPart {
    org.eclipse.draw2d.FreeformLayer objectsLayer;
    org.eclipse.draw2d.ConnectionLayer connectionLayer;
    public void createPartControl(Composite parent) {
        org.eclipse.draw2d.FigureCanvas canvas = new org.eclipse.draw2d.FigureCanvas(composite);

        org.eclipse.draw2d.LayeredPane pane = new org.eclipse.draw2d.LayeredPane();

        objectsLayer = new org.eclipse.draw2d.FreeformLayer();
        connectionLayer = org.eclipse.draw2d.ConnectionLayer();

        pane.add(objectsLayer);
        pane.add(connectionLayer);

        canvas.setContents(pane);

        addFigures();
        addConnections();
    }

    private void addFigures() {
        // Adds Objects, i.e.,  org.eclipse.draw2d.Figure Objects, to the objectLayer
        // which turn contains, 1 or more org.eclipse.draw2d.Panel Objects, 
        // with variable number of org.eclipse.draw2d.Label objects
    }

    private void addConnections() {
        // Adds org.eclipse.draw2d.PolylineConnection objects to the connectionLayer
        // between objects in the objectLayer
    }
}
4

1 に答える 1

1

LayeredPane クラスを拡張し、そのインターフェイスを実装して Serializable にし、モデルからその LayeredPane の構造全体とプロパティを再構築するメソッドを提供する必要があります。

public class SerializableLayeredPanne extends LayeredPanne implements Serializable {

    private static final long serialVersionUID = 1L;

    /** 
     * the model you are able to FULLY restore layered pane and all its children from,
     * it MUST be serializable 
     */
    private final Serializable model;

    SerializableLayeredPanne(Serializable model) {
        this.model  = model;
    }

    public void init() {
        // set font, color etc.
        // add children
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        init();
    }

}

そのため、Figure ツリーを最初から作成するために必要なすべての情報を含む Serializable モデルを追加する必要があります。

于 2012-12-11T13:30:31.287 に答える