读取和编写(序列化)不同类中的静态嵌套类对象

时间:2016-05-04 11:35:39

标签: java exception serialization core

我想序列化一个Map对象,该对象包含一个静态嵌套的CustomClass对象作为其值。

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。是因为在不同类下定义的相同嵌套类将具有不同的名称或版本吗?

该问题的可能解决方案是什么。 感谢

3 个答案:

答案 0 :(得分:0)

嵌套类全名包括封闭类名。对A $ CustomClass和B的写入具有B $ CustomClass

答案 1 :(得分:0)

  

是因为在不同类下定义的相同内部类具有不同的名称或版本吗?

这是因为在不同的班级下定义的同一内部班级&#39;这是一个矛盾。它不是相同。这是一个不同的阶层。

NB static inner is also a contradiction in terms

答案 2 :(得分:0)

class B中,我已用下面的代码替换了它,对我来说效果很好。

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

此外,我无法在readObject(Object)中找到将ObjectInputStream与对象作为参数的方法。