保存自定义类对象的数组

时间:2012-06-10 05:42:33

标签: java arrays multidimensional-array

我想知道是否有一种简单的方法可以保存对象数组,而无需通过并保存对象的每个方面。在我的示例中,我有两个数组,一个是单个数组,另一个是2D数组,包含引用自定义类的对象。每个对象都有特定的细节,如x和y整数,布尔值,字符串等。附加到它们(块[0] .x,块[0] .canWalk,块[0] .name)我想知道是否有一种简单的方法将这些数组保存到文件而不必使用for循环和保存每个部分。多维数组只是与第一个数组相同的已保存数组的数组(savedBlock [0] [0] .x ...)

到目前为止(抛出NotSerializableException):

public class Save
{
    static File f;
    static ObjectOutputStream os;
    public static void openFile()
    {
        try
        {
            if(!new File("c:\\IDsGame").exists())
            {
                new File("c:\\IDsGame").mkdirs();
            }

            f = new File("c:\\IDsGame\\data.bin");
            os = new ObjectOutputStream(new FileOutputStream(f));

            writeFile();
        }
        catch(Exception e)
        {
            System.err.println("creating file");
        }
    }

    public static void writeFile()
    {
        try
        {
            ArrayList<Object> map = new ArrayList<Object>(Arrays.asList(Map.block));
            ArrayList<Object> savedMaps = new ArrayList<Object>(Arrays.asList(Map.savedMaps));
            os.writeObject(map);
            os.writeObject(savedMaps);
            os.close();
        }
        catch (IOException e) {System.out.println(e);}

    }
}

在我的map类中,我初始化块(Blocks [])和savedMaps(Blocks [] [])。 My Blocks类认为:

public class Blocks implements Serializable
{
    public boolean canWalk, onTop, itemTaken;
    public Image img = null, imgBack = null;
    public final Image (a ton of different images)
    public String name, item, message, title;
    public char initMap, initEx, initIt;
    public int x, y, height, width;

    public Blocks()
    {
        canWalk = true;
        onTop = false;
        itemTaken = false;
        img = null;
        name = null;
        item = null;
        message = null;
        x = 0;
        y = 0;
        height = 0;
        width = 0;
    }
}

显然我在Map类中更改了不同数组的某些部分,我想知道是否有更简单的方法(根本)保存Blocks对象的数组。

感谢您抽出宝贵时间提供帮助,如果您需要更具体的信息,请告诉我们。

I.D。

2 个答案:

答案 0 :(得分:0)

图像不可序列化,因此在序列化Blocks类时会收到NotSerializableException。 ImageIcon可以被序列化,因此在ImageIcons中包装Image实例将解决该问题。

public class Blocks implements Serializable
{
    public boolean canWalk, onTop, itemTaken;
    public ImageIcon img = null, imgBack = null;
    public final ImageIcon (a ton of different images)
    public String name, item, message, title;
    public char initMap, initEx, initIt;
    public int x, y, height, width;

    public Blocks()
    {
        canWalk = true;
        onTop = false;
        itemTaken = false;
        img = null;
        // img = new ImageIcon(someImageInstance)
        name = null;
        item = null;
        message = null;
        x = 0;
        y = 0;
        height = 0;
        width = 0;
    }
}

答案 1 :(得分:0)

仅仅创建一个类实现Serializable是不够的:所有字段也必须是Serializable

您的Block课程可能有问题。所有常见的java类都是Serializable,但Block也有Image类型的字段。如果Image不是Serializable,则尝试序列化Block会抛出NotSerializableException