2016-11-14 10 views
1

EMFを使用してJavaでアプリケーションをビルドします。
Java8 JDKを使用しています。
私の必要なのは、モデルのクラスのインスタンスを永続させることです。
Eclipseから離れた場所にあるWildFly 10サーバーでコードをデバッグモードで実行します。EMF NotSerializableException

private String getXml(Audit audit) throws NeoflexException { 
    XMLResource res = new XMLResourceImpl();   
    res.getContents().add(audit);  
    StringWriter sw = new StringWriter(); 

    try { 
     res.save(sw, null); 
    } catch (IOException e) { 
     throw new NeoflexException(e); 
    } 

    return sw.toString(); 
} 

シリアル化では、NotSerializableExceptionが得られます。
生成された監査クラスがSerializableとしてマークされていないことがわかります。
生成されたコードを編集することはできませんが、グラフのこのクラスをシリアライズ可能としてマークするオプションはありません。
説明:https://www.eclipse.org/forums/index.php/t/261475/
インターフェイスを作成してシリアライズ可能から派生する必要がありますが、そのようなオプションはありません。付属のスクリーンショットを参照してください。一般に

Serializable

答えて

3

、EMFの直列化は、ISerializableインターフェイスにバインドされていないが、モデル要素間に形成された包含階層。さらに、EMFインターフェースは、誤解を招く(EMFモデル・オブジェクトは基本的なJava直列化を使用して直列化可能ではないと想定される)ので、ISerializable inferfaceをまったく拡張するべきではありません。

基本的に、クラスのインスタンスは包含ツリー用でなければなりません。一つのオブジェクトはツリーのルートでなければならず、他のすべてのインスタンスが含まれている必要があります。次に、モデルルートをリソースに追加することで、この包含階層全体をファイルに保存することができます。

私の最初のヒントは、監査要素が他のモデル要素を参照しているかどうかをチェックすることです。なぜなら、その要素が非包含関係で参照されていると、直列化が失敗するからです。

リレーションの包含を設定するには、メタモデル(Audit.ecoreファイル)を編集し、という包含プロパティを参照用にtrueに設定します。ただし、閉じ込めサブツリーが正しく設定できることを確認する必要があります。モデルのルート要素は1つだけです。他のすべての要素は、モデルルートからちょうどパス包含参照によって到達することができます。要素が相互参照によって参照される場合、EMF直列化(Resource.save)が機能するためには、包含階層に包含される必要があります。

EMFリソースファイルを手動で作成すると、モデルを保存する場所を決めるURIがなく、リソースセットがなくてもモデルが複数のファイル/リソースに分割されます独立した包含階層)。

つまり、ResourceSetインスタンスを作成し、それを使用してモデルリソースインスタンスを作成する必要があります。

詳細については、basicserialization specificのチュートリアルをvogella.comで確認することをおすすめします。

関連する問題