Сериализация коллекции вида Map<Object, Map<Object, Integer>>

0
07 мар 2016 21:05
Как сериализовать коллекцию вида:
public Map<Student, Map<Task, Integer>> journal = new TreeMap<>();

Student и Task сериализуемые. Данная коллекция полностью заполнена. Но при сериализации, при вызове writeObject(journal), выдает ошибку "NotSerializableException".
Подскажите, может есть некоторые особенности сериализации вложенных коллекций? Обычная коллекция (не вложенная) сериализуется без проблем.
(Если нужно будет, выложу пример кода).

Класс Student:
public class Student implements Serializable {
    private String name;
    public Student(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    @Override
    public String toString() {
        return "\nStudent: " + name;
    }
}

Класс Task:
public class Task implements Serializable{
    private String name;
    public Task(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "\tTask: " + name;
    }
    public String getName() {
        return name;
    }
}


И класс Main с методом main:
public class Main {
    static final int COUNTSTUDENTS = 9;
    static final int COUNTTASKS = 24;
    public Map<Student, Map<Task, Integer>> journal = new TreeMap<>(new Comparator() {
        @Override
        public int compare(Object o1, Object o2) {
            return ((Student) o1).getName().compareTo(((Student) o2).getName());
        }
    });

    public static void main(String[] args) {
        Main main = new Main();
        Student[] students = new Student[COUNTSTUDENTS];
        for (int i = 0; i < students.length; i++) {
            students[i] = new Student("Student " + i);
        }

        Task[] tasks = new Task[COUNTTASKS];
        for (int i = 0; i < 24; i++) {
            tasks[i] = new Task("Task " + i);
        }

        Map<Task, Integer> tasksValue = new TreeMap<>(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((Task) o1).getName().compareTo(((Task) o2).getName());
            }
        });

        for (int i = 0; i < students.length; i++) {
            for (int j = 0; j < tasks.length; j++) {
                tasksValue.put(tasks[j], new Random().nextInt(100));
            }
            main.journal.put(students[i], tasksValue);
        }

        for (Map.Entry<Student, Map<Task, Integer>> entryStudent : main.journal.entrySet()) {
            System.out.println(((Student) entryStudent.getKey()).getName());
            for (Map.Entry<Task, Integer> entryTask : entryStudent.getValue().entrySet()) {
                System.out.println(((Task) entryTask.getKey()).toString() + " " + (((Integer) entryTask.getValue()).toString()));
            }
        }

        //Write
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("journal.ser"));
            oos.writeObject(main.journal);
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}


Спасибо, решил! Нельзя анонимные классы использовать.
Модераторы: Нет
Сейчас эту тему просматривают: Нет