【问题标题】:Load/Store Objects in file in Java在Java文件中加载/存储对象
【发布时间】:2011-02-14 06:08:34
【问题描述】:

我想将我的类中的对象存储在文件中,然后才能从该文件中加载对象。但是在某个地方我犯了一个错误,无法弄清楚在哪里。我可以得到一些帮助吗?

public class GameManagerSystem implements GameManager, Serializable {

    private static final long serialVersionUID = -5966618586666474164L;
    HashMap<Game, GameStatus> games;
    HashMap<Ticket, ArrayList<Object>> baggage;
    HashSet<Ticket> bookedTickets;
    Place place;


    public GameManagerSystem(Place place) {
        super();

        this.games = new HashMap<Game, GameStatus>();
        this.baggage = new HashMap<Ticket, ArrayList<Object>>();
        this.bookedTickets = new HashSet<Ticket>();
        this.place = place;
    }
    public static GameManager createManagerSystem(Game at) {
        return new GameManagerSystem(at);
    }

    public boolean store(File f) {
        try {
            FileOutputStream fos = new FileOutputStream(f);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(games);
            oos.writeObject(bookedTickets);
            oos.writeObject(baggage);
            oos.close();
            fos.close();
        } catch (IOException ex) {
            return false;
        }
        return true;
    }
    public boolean load(File f) {
        try {
            FileInputStream fis = new FileInputStream(f);
            ObjectInputStream ois = new ObjectInputStream(fis);
            this.games = (HashMap<Game,GameStatus>)ois.readObject();
            this.bookedTickets = (HashSet<Ticket>)ois.readObject();
                this.baggage = (HashMap<Ticket,ArrayList<Object>>)ois.readObject();
            ois.close();
            fis.close();
        } catch (IOException e) {
            return false;
        } catch (ClassNotFoundException e) {
            return false;
        }
        return true;
    }
.
.
.
}


public class JUnitDemo {

    GameManager manager;

    @Before
    public void setUp() {
        manager = GameManagerSystem.createManagerSystem(Place.ENG);
    }

    @Test
    public void testStore() {
        Game g = new Game(new Date(), Teams.LIONS, Teams.SHARKS);
        manager.registerGame(g);
        File file = new File("file.ser");
        assertTrue(airport.store(file));
    }
}

【问题讨论】:

  • 您看到的错误是什么?
  • 我很好奇。既然整个对象都是可序列化的,那你为什么不做oos.writeObject(this)呢?
  • 我得到 NotSerializableException :(
  • Game、GameStatus 和 Ticket 是否实现了可序列化?您是否尝试过隔离每个 writeObject 以查看此异常的来源?
  • 对象是不可序列化的,那么行李的典型内容是什么类型?

标签: java file load store


【解决方案1】:

这个问题的解决方法是,当你在使用其他对象时,比如说A类,放到一个像HashMap这样的集合中,并且想序列化HashMap对象,然后implement接口Serializable像这样的A 类:

class A implements Serializable {
}

...
    HashMap<Integer,A> hmap;
...

否则该对象将无法序列化。

我希望它现在可以解决这个问题。

【讨论】:

    【解决方案2】:

    请记住,整个对象图在序列化期间是持久的。例如,如果你有一些对 GUI 类的引用,你要么必须使它们也可序列化,要么将它们标记为“瞬态”,这样 Java 就不会序列化它们。

    【讨论】:

      【解决方案3】:

      在关闭它之前尝试 oos.flush()。

      【讨论】:

      • 所有 OutputStreams 在 close() 之前执行 flush()
      • ...至少实现得很好,这包括 JRE 中的内容。
      猜你喜欢
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多