Задача сериализации объектов

У меня проблема с сериализацией (сохранение и загрузка игровых переменных), когда я сохраняю evreything, похоже, правильно сохраняет, но когда я пытаюсь загрузить его, он обнаруживает только первые 3 объекта, которые я сохранил, а остальные - нулевые. Я использую сериализацию неправильно или я не могу сэкономить.

Сохранение объектов с помощью этого:

FileOutputStream f_out = new 
                FileOutputStream("c:\\save.data");

            // Write object with ObjectOutputStream
            ObjectOutputStream obj_out = new
                ObjectOutputStream (f_out);

            // Write object out to disk

                obj_out.writeObject ( player.currentPerson );
                obj_out.writeObject ( player.gold );
                obj_out.writeObject ( Global.currentJob );
                obj_out.writeObject ( Global.currentWifeJob );
                obj_out.writeObject ( Global.currentWife );
                obj_out.writeObject ( Global.currentFood );
                obj_out.writeObject ( Global.currentCity );
                obj_out.writeObject ( Global.childList );
                obj_out.writeObject ( Global.generationList );
                obj_out.writeObject ( Global.currentPortrait );
                obj_out.writeObject ( Global.maxGeneration );
                obj_out.writeObject ( Global.currentGeneration );
                obj_out.writeObject ( Global.bloodlineRanking );
                obj_out.writeObject ( year ); 

Загрузка объектов:

  // Read from disk using FileInputStream
                    FileInputStream f_in = new 
                        FileInputStream("c:\\save.data");

                    // Read object using ObjectInputStream
                    ObjectInputStream obj_in = 
                        new ObjectInputStream (f_in);

                    Object obj = (Object) obj_in.readObject();

                        do{
                            if(obj == null){
                                System.out.println("Skipped" + i);
                                i++;
                                continue;
                            } 
                            else{
                                    if(i==0)
                            player.currentPerson  =  (Person) obj;
                        else if(i==1)
                            player.gold = (int) obj;
                        else if(i==2)
                            Global.currentJob = (Job) obj;
                        else if(i==3)
                            Global.currentWifeJob = (Job) obj;
                        else if(i==4)
                            Global.currentWife = (Wife) obj;
                        else if(i==5)
                            Global.currentFood = (Food) obj;
                        else if(i==6)
                            Global.currentCity = (String) obj;
                        else if(i==7)
                            Global.childList = (ArrayList<Child>) obj;
                        else if(i==8)
                            Global.generationList = (ArrayList<Generation>) obj;
                        else if(i==9)
                            Global.currentPortrait = (Portrait) obj;
                        else if(i==10)
                            Global.maxGeneration  = (Integer) obj;
                        else if(i==11)
                            Global.currentGeneration  = (Integer) obj;
                        else if(i==12)
                             Global.bloodlineRanking = (Integer) obj;
                        else if(i==13)
                            world.year = (Integer) obj;

                            }
                            System.out.println(obj.getClass());
                            System.out.println(i);

                            i++;
                            obj = obj_in.readObject();
                        }
                        while(i < 20);

Вот вывод печати

class javagame.Father
0
class java.lang.Integer
1
class javagame.Job
2
Skipped3
Skipped4
Skipped5
Skipped6
Skipped7
Skipped8
Skipped9
Skipped10
Skipped11
Skipped12
Skipped13
5 голосов | спросил Matthew 8 J000000Monday13 2013, 14:39:58

3 ответа


5

Существует несоответствие с записываемыми вами объектами (currentPerson thru year, 14 объектов) и те, которые вы читаете (currentPerson thru generationList, 9 объектов). И как только вы закончите плеер, вам нужно сбросить i до нуля. Вы можете разбить цикл, когда объект имеет значение null.

ответил ott-- 8 J000000Monday13 2013, 15:03:04
6

Итак, мое решение для этого состоит в том, что я создал класс SAVE, в котором хранятся все переменные, которые мне нужны

public class Save implements java.io.Serializable{


    Person person = null;
    int gold = 0;
    Job currentJob = null;
    Job currentWifeJob = null;
    Wife currentWife = null;
    Food currentFood = null;
    String currentCity = null;
    ArrayList<Child> childList = null;
    ArrayList<Generation> generationList = null;
    Portrait currentPortrait = null;
    int maxGeneration = 0;
    int currentGeneration = 0;
    int bloodlineRanking = 0;
    int year = 0;


    public void refresh(Player player,int yearr){
        person = player.currentPerson ;
        gold = player.gold ;
        currentJob = Global.currentJob ;
        currentWifeJob = Global.currentWifeJob ;
        currentWife = Global.currentWife ;
        currentFood = Global.currentFood ;
        currentCity = Global.currentCity ;
        childList = Global.childList ;
        generationList =  Global.generationList ;
        currentPortrait = Global.currentPortrait ;
        maxGeneration = Global.maxGeneration ;
        currentGeneration = Global.currentGeneration ;
        bloodlineRanking =  Global.bloodlineRanking ;
        year = yearr ; 
    }

}

Это для сохранения

public void save(Player player,Save s){
        s.refresh(player, year);
        try {
            FileOutputStream f_out = new 
                FileOutputStream("c:\\save.data");

            // Write object with ObjectOutputStream
            ObjectOutputStream obj_out = new
                ObjectOutputStream (f_out);

            obj_out.writeObject (s);
            // Write object out to disk


            obj_out.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

Это для загрузки

if(Global.loadEnable){
    try {

        // Read from disk using FileInputStream
        FileInputStream f_in = new 
            FileInputStream("c:\\save.data");

        // Read object using ObjectInputStream
        ObjectInputStream obj_in = 
            new ObjectInputStream (f_in);

        Object obj = (Object) obj_in.readObject();

        save = (Save) obj;

        player.currentPerson = save.person;
        player.gold = save.gold;
        Global.currentJob = save.currentJob;
        Global.currentWifeJob = save.currentWifeJob;
        Global.currentWife = save.currentWife;
        Global.currentFood = save.currentFood;
        Global.currentCity = save.currentCity;
        Global.childList = save.childList;
        Global.generationList = save.generationList;
        Global.currentPortrait = save.currentPortrait;
        Global.maxGeneration = save.maxGeneration;
        Global.currentGeneration = save.currentGeneration;
        Global.bloodlineRanking = save.bloodlineRanking;
        world.year = save.year;


    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    // Read an object
}
ответил Matthew 8 J000000Monday13 2013, 18:26:33
3

Вместо использования собственного класса для реализации сохранения /восстановления вы должны выполнить одно из следующих действий:

  • реализовать Serializable в ваших классах и использовать transient, чтобы отметить пропущенные поля.
  • реализовать Externalizable и определить его readExternal и writeExternal
  • используйте библиотеку, например, парсер JSON (для этого Джексон - довольно хорошая библиотека java)
ответил AJMansfield 8 J000000Monday13 2013, 20:14:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132