Сериализация вектора - PullRequest
1 голос
/ 20 марта 2011

Я пытаюсь реализовать загрузку и сохранение для игры, над которой я работаю.

Что я хочу сохранить:

  • A char[][] (двумерный массив/ matrix)
  • An ArrayList<Entity>

Сущность - это суперкласс для Dragon, Hero и Item.Все эти три типа могут содержаться одновременно в ArrayList.

Пока у меня есть это:

package logic;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public final class LoadAndSave {
    public static final transient boolean available = false;

    public static final boolean serialize(Object obj) {

        // Write to disk with FileOutputStream
        FileOutputStream saveFile;
        try {
            saveFile = new FileOutputStream("game.sav");
        } catch (FileNotFoundException e) {
            return false;
        }

        // Write object with ObjectOutputStream
        ObjectOutputStream objOut;
        try {
            objOut = new ObjectOutputStream(saveFile);
        } catch (IOException e) {
            //
            return false;
        }

        // Write object out to disk
        try {
            objOut.writeObject(obj);
        } catch (IOException e) {
            return false;
        }

        return true;
    }

    public static final Object load() {
        FileInputStream fileIn;
        try {
            fileIn = new FileInputStream("game.sav");
        } catch (FileNotFoundException e1) {
            return null;
        }

        // Read object using ObjectInputStream
        ObjectInputStream objIn;
        try {
            objIn = new ObjectInputStream(fileIn);
        } catch (IOException e) {
            return null;
        }

        // Read an object
        Object obj;
        try {
            obj = objIn.readObject();
        } catch (IOException e) {
            return null;
        } catch (ClassNotFoundException e) {
            return null;
        }

        return obj;
    }

}

Я думаю, что код довольно понятен.Теперь мои вопросы:

  1. Хватит ли этого кода?
  2. Нужно ли реализовывать определенные методы сериализации для Dragon, Item и Hero?
  3. Как механизм сериализации будет справляться с фактом наличия у меня вектора Entityполный типов, которые не Entity, но производные классы?Спасибо за ваше время!

ОК, все вроде бы хорошо, кроме одного ArrayList.Он либо не сохраняется, ни загружается (null pointer exception при вызове size()).

С чем это может быть связано?

Ответы [ 2 ]

3 голосов
/ 20 марта 2011

Если вы хотите, чтобы вся структура была сериализуемой, то вам нужно также сделать части сериализуемыми.На практике это означает, что вам нужно, чтобы классы Dragon, Hero и Item реализовали Serializable.Это просто интерфейс маркера, поэтому вам нужно всего лишь добавить implements Serializable.Некоторые идентификаторы (по крайней мере, затмение, в любом случае) могут жаловаться на то, что вы должны добавить private long SerialVersionUID, который может немного оптимизировать сериализацию, а может и нет - в любом случае это не является строго необходимым.

Это требование рекурсивно - любоеоб их подчастях, которые являются пользовательскими или не сериализуемыми объектами, также необходимо позаботиться, поэтому, например, если ваш класс Item выглядит следующим образом

 public class Item implements Serializable {
    private String s;
    private MyClass c;
    ..

, то вам также необходимо сделать MyClass Serializable,любые переменные экземпляра и т. д. и т. д.

2 голосов
/ 20 марта 2011

Я не вижу никакой причины для определенных методов сериализации для Dragon, Item и Hero, если вам не требуются какие-то особые вещи, которые не может обработать механизм сериализации по умолчанию.(Конечно, классы должны быть сериализуемы, как упомянуто Стивом Б.)

У вас уже есть много кода, поэтому я подозреваю, что вы уже выполнили некоторые тесты.Сталкивались ли вы с определенными проблемами?Или как получилось, что вы спрашиваете это?

Обновление:

Я заметил некоторые аспекты в вашем коде, которые не имеют прямого отношения к вашему вопросу, но могутВ любом случае вам будет интересно:

  • Вы действительно хотите использовать Vector?Использует ли ваше приложение многопоточность и требуется ли сериализация?Если нет, вы можете вместо этого использовать ArrayList или около того.
  • Способ обработки исключений довольно странный.Возможно, вы делаете это только потому, что это пример ... Вы не должны подавлять исключения, просто возвращая true или false.Если вы ожидаете, что вызывающие методы будут заинтересованы в исключениях, вы должны просто добавить исключение в методы signatur (throws ...) и позволить вызывающему методу позаботиться об этом.Если вы чувствуете, что это неуместно, возможно, стоит включить такие исключения в пользовательские исключения, которые более выразительны в контексте.Если вы вообще не заботитесь об исключении, возможно также его преобразование в исключение времени выполнения.В случае успеха ваш метод может просто ничего не возвращать ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...