簡體   English   中英

無法序列化ArrayList

[英]Can't serialize an ArrayList

這是序列化向量的后續步驟

我正在嘗試為我正在開發的游戲實現加載和保存。

我想保存一個Maze ,其中除其他屬性外,還包含EntityArrayList

實體是龍,英雄和物品的超類。 所有這三種類型都可以一次包含在向量中。

使用“自動”序列化機制(將implements Serializableimplements Serializable添加到Maze )可保存除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;
    }

}

Entity序列化嗎? (您提到過,迷宮只是可序列化的)。

並且請確保該列表未定義為瞬時靜態的 ,否則序列化機制將跳過該列表。

您需要確保關閉流。 您的load()代碼可以簡化為如下所示:

ObjectInputStream objIn = null;
try {
    objIn = new ObjectInputStream(new FileInputStream("game.sav"));
    return objIn.readObject();
} catch (Exception exception) {
    // Deal with errors
    return null;
} finally {
    if (objIn != null) {
        try {
            objIn.close();
        } catch (Exception exception) {}
    }
}

serialise()可以類似的方式更改。

我按照以下假設檢查了您的代碼:

class Entity implements Serializable {}

和:

private char[][] mazeWalls = new char[0][0];

private Vector<Entity> entities = new Vector<Entity>();

...並且完美地工作,可以序列化和反序列化空的Entity對象...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM