Serializableを全てのフィールドに再帰的に自動付与する機能


JavaのクラスをSerializableにする場合、存在するフィールド全てに再帰的にSerializableを付与する必要がありますが、これを自動的に行うIDEの機能やツールはあるでしょうか。




直接的な回答ではないのですが、勘違いされている可能性もあるかと考えましたので記載します。

> 存在するフィールド全てに再帰的にSerializableを付与する必要があります

というのは十分条件ではあっても、必要条件ではありません。

例えば、以下の様な`Child`型をフィールドに持つ`Parent`があるとき、

[code]

    class Parent implements Serializable {
    
        private Child child;
    
        // ...
    }
    
    class Child {
    }
    
[/code]

`Child`型が`Serializable`でないので`Parent`は実際にはシリアライズ不能である、 **というわけではありません** 。

`child`フィールドにセットされているのが次のような型のインスタンスであれば、シリアライズ可能です。

[code]

    class SerializableChild extends Child implements Serializable {
    }
    
[/code]

あるいは、`child`が`null`であってもシリアライズ可能です。

一方、次の型のインスタンスがセットされていれば、シリアライズに失敗します。

[code]

    class NonSerializableChild extends Child {
    }
    
[/code]

(実行可能サンプルコード: <http://ideone.com/2ER9Dm> )

* * *

[Javadoc](http://docs.oracle.com/javase/jp/8/api/java/io/Serializable.html)が言うところの

>
> クラスの直列化可能性は、java.io.Serializableインタフェースを実装するクラスによって有効になります。このインタフェースを実装していないクラスでは、その状態が直列化または直列化復元されることはありません。  
>  (略)  
>
> グラフの巡回中に、直列化可能インタフェースをサポートしていないオブジェクトに遭遇することがあります。この場合は、NotSerializableExceptionがスローされ、この例外によって非直列化可能オブジェクトのクラスが特定されます。

を感覚的に分かりやすいように翻訳すると、

  * **クラス** が`Serializable`で無ければシリアライズ、デシリアライズ時に無視される(詳しくはJavadocの後続文章参照)
  * **オブジェクト** が`Serializable`で無ければ実行時に例外がスローされる

ということになります。

