

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


CC BY-SA 3.0
2015-10-22T11:08:06.600
17956
2015-12-05T07:30:22.360
2015-12-05T07:30:22.360
46
816
question
java
Serializableを全てのフィールドに再帰的に自動付与する機能


Serializableを実装(implements)したクラスのフィールドには、Serializableの宣言をする必要はありません。

言い換えると、Serializableを実装したクラスのフィールドは、プリミティブ型もしくはシリアライズ可能なクラスでないと、シリアライズできません。

ひょっとして、以下のようなことができるエディアをお探しでしょうか。

[code]

    public class Sample implement Serializable {
        public Child child;
    }
    
[/code]

このSampleクラスを作った後に、Childクラスを作ろうとすると、

[code]

    public class Child [ implements Serializable ここが自動的に生成] {
    
    }
    
[/code]

ということでしょうか。


CC BY-SA 3.0
2015-10-25T17:10:51.403
18062
2015-10-25T17:10:51.403
5778
17956
answer


無いようなのでとりあえず自分でカンタンなものを作ってみました。  
今のところはあるフォルダ下にあるクラスを全てSerializableにするだけで、少し複雑なクラスだとうまくいかないこともあります。

<https://github.com/lamrongol/MakeJavaClassSerializable>


CC BY-SA 3.0
2015-11-04T02:34:41.267
18390
2015-11-04T02:34:41.267
816
17956
answer


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

> 存在するフィールド全てに再帰的に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`で無ければ実行時に例外がスローされる

ということになります。


CC BY-SA 3.0
2015-11-04T05:22:55.260
18394
2015-11-04T05:22:55.260
2808
17956
answer