2017-01-15 13 views
2

JDK 1.7で使用しています。コードレビューで問題が発生しました。SonarQubeserializeableJava地図のマップ(例:Map <String、Map <String、String >>)がシリアル化可能でない理由

public class SerializationTest implements Serializable { 

    private Map<String,String> test1=new HashMap<>(); //Serializeable 
    private Map<ANEnum,String> test2=new HashMap<>(); //Serializeable 
    private Map<String,ASerializeableObject> test3=new HashMap<>(); //Serializeable 

    private Map<String,Map<String,String>> test4=new HashMap<>(); //Not Serializeable 
    private Map<ANEnum,Map<String,String>> test5=new HashMap<>(); //Not Serializeable 
    private Map<String,Map<String, ASerializeableObject>> test6=new HashMap<>(); //Not Serializeable 

ソナーマーク最後の3 HashMapのないよう:

サンプルの下にご検討ください。ソナーエラーは私の知る限りHashMapを推測として(Make "test4" transient or serializable

でそのキーと値はserializeableある場合serializeableです。しかし、HashMapの値を別のHashMapに設定すると、元のHashMapserializeableにはなりません。

このソナーの問題は正しいですか。それはどうすれば私はそれを修正することができますか?

+1

何かがシリアル化可能かどうかをテストするには、シリアル化します。ソナーは、実行時にマップに実際に含まれるものがシリアライズ可能かどうかを知ることはできません。また、ソナー違反について尋ねる場合は、正確で完全なメッセージとルール名を投稿してください。 –

+0

変数が宣言され、同じステートメントで初期化されているため、Sonarqubeの部分ではむしろ労力がかかりません。 – EJP

+0

@EJP SOnarはマップが 'Map'のインスタンスを含んでおり、' Map'がシリアライズ可能でないため、マップがシリアライズ可能であることを保証することはできません。実行時にはそうかもしれませんが、コンパイル時に内部マップが直列化可能であるという保証はありません。 –

答えて

5

のは、各行、一つずつ見てみましょう:

private Map<String,String> test1=new HashMap<>(); 

キータイプ、文字列は、直列化可能です。値の型Stringは直列化可能です。具体的なMap型、HashMapは直列化可能です。したがって、すべてがシリアライズ可能です。

private Map<ANEnum,String> test2=new HashMap<>(); 

キータイプANEnumはシリアル化可能です。値の型Stringは直列化可能です。具体的なMap型、HashMapは直列化可能です。したがって、すべてがシリアライズ可能です。

private Map<String,ASerializeableObject> test3=new HashMap<>(); 

キータイプStringはシリアル化可能です。値型ASerializeableObjectはシリアライズ可能です。具体的なMap型、HashMapは直列化可能です。したがって、すべてがシリアライズ可能です。

private Map<String,Map<String,String>> test4=new HashMap<>(); 

キータイプStringはシリアル化可能です。具体的なMap型、HashMapは直列化可能です。 値の型Mapは、であり、必ずしもがシリアライズできません。 Map(HashMapのような)のいくつかの具体的な実装は、直列化可能です。他にはありません。したがって、Sonarはこのフィールドがシリアライズ可能であることを保証できず、警告を出します。シリアライズ可能なマップだけを値として保存することが確実であれば問題ありません。直列化できないマップを格納すると、実行時に直列化が失敗します。

前と

private Map<String,Map<String, ASerializeableObject>> test6=new HashMap<>(); 

同じ説明をする前と

private Map<ANEnum,Map<String,String>> test5=new HashMap<>(); //Not Serializeable 

同じ説明ソナーは時々助け、時には邪魔になることができる唯一のツールであることを覚えておいてください。あなたはコントロールするべきであり、警告によってあなたが物事を変えるべきかどうかを決定する必要があります。

+0

_ Mapのいくつかの具体的な実装(HashMapなど)はシリアライズ可能です。いくつかの他のnot_ ....これは私が私が知ってはならないものでした!ありがとう! –

関連する問題