2016-05-04 10 views
1

スタティックネストされたCustomClassオブジェクトをその値として含むMapオブジェクトをシリアル化する必要があります。異なるクラスの静的ネストされたクラスオブジェクトの読み込みと書き込み(シリアライズ)

public class A{ 

    static Map<String, CustomClass> map = new HashMap<>(); 

    public static void main(String[] args) { 
     map.put("ABC", new CustomClass(1, 2L, "Hello")); 
     writeToFile(); 
    } 

    private static void writeToFile() throws IOException, ClassNotFoundException { 
     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("file.ser")); 
     out.writeObject(map); 
    } 

    private static class CustomClass implements Serializable { 
     int x; 
     long y; 
     String z; 
     private static final long serialVersionUID = 87923834787L; 
     private CustomClass (int x, long y, String z) { 
     ..... 
     } 
    } 

} 


public class B { 

    static Map<String, CustomClass> map = new HashMap<>(); 

    public static void main(String[] args) { 
     readFromFile(); 
    } 

    private static void readFromFile() throws IOException, ClassNotFoundException { 
     ObjectInputStream out = new ObjectInputStream(new FileInputStream("file.ser")); 
     map = out.readObject(); // ClassNotFoundException occured 
    } 

    private static class CustomClass implements Serializable { 
     int x; 
     long y; 
     String z; 
     private static final long serialVersionUID = 87923834787L; 
     private CustomClass (int x, long y, String z) { 
     ..... 
     } 

     //some utility methods 
     .... 
    } 

} 

シリアル化されたMapオブジェクトを読み込もうとすると、ClassNotFoundExceptionがスローされます。異なるクラスの下で定義された同じネストされたクラスは異なる名前またはバージョンを持つためですか?

この問題の可能な解決方法は何か。 ありがとう

答えて

0

異なるクラスで定義された同じ内部クラスが異なる名前またはバージョンを持つためですか?

'異なるクラスの下で定義された同じ内部クラス'が矛盾しているためです。 ではありません。それは別のクラスです。

NB static inner is also a contradiction in terms

0

ネストされたクラスの完全な名前には、クラス名が含まれています。 A $ CustomClassへの書き込みとB $ CustomClassへの書き込み

1

あなたのclass Bでは、私は以下の行に置き換えてくれて、うまくいきました。また

map = (Map<String, CustomClass>) out.readObject();//Line no 19 

、私はObjectInputStreamのパラメータとしてのオブジェクトとreadObject(Object)と方法を見つけることができませんでした。

+0

"readObject(Object)"ここでデモコードを入力するのは間違いでした。それをout.readObject()として読んでください –

+0

それは 'クラスB'を実行している間に'クラスA '自体が見つからないことを意味します。 'Class B'を実行する前にクラスパスをチェックすることができますか、SystemClassloaderを利用してプログラム自体を実行している間にクラスパスを記録することができます。 – Praveen

関連する問題