0

我正在序列化和反序列化一个大型二维对象数组。每个对象都包含创建 a 的指令BufferedImage- 这样做是为了避免BufferedImage本身不能直接序列化。

被序列化的类是:

public final class MapTile extends TransientImage
{
    private static final long serialVersionUID = 0;
    private transient BufferedImage f;
    transient BufferedImage b;
    int along;
    int down;
    boolean flip = false;
    int rot = 0;

    public MapTile(World w, int a, int d)
    {
        // f = w.getMapTiles();
        along = a;
        down = d;
        assignImage();
    }

    public MapTile(World w, int a, int d, int r, boolean fl)
    {
        // f = w.getMapTiles();
        along = a;
        down = d;
        rot = r;
        flip = fl;
        assignImage();
    }

    public int getA()
    {
        return along;
    }

    public int getD()
    {
        return down;
    }

    @Override
    public void assignImage()
    {
        if (f == null)
        {
            f = World.mapTiles;
        }
        b = f.getSubimage(along, down, World.squareSize, World.squareSize);
        if (rot != 0)
        {
            b = SmallMap.rotateImage(b, rot);
        }
        if (flip)
        {
            b = SmallMap.flipImage(b);
        }
        super.setImage(b);
        f.flush();
        b.flush();
        f = null;
        b = null;
    }
}

延伸:

public abstract class TransientImage implements Serializable
{
    private transient BufferedImage image;

    public BufferedImage getImage()
    {
        return image;
    }

    public void setImage(BufferedImage i)
    {
        image = i;
    }

    public abstract void assignImage();

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
    {
        in.defaultReadObject();
        assignImage();
    }
}

这最终将成为地图的一部分 - 通常它是随机创建的,但某些区域每次都必须相同,因此将它们序列化并重新读取数组。因为在正常使用期间我永远不需要保存图像,所以我正在输入编写代码:

try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("verticalroad.necro"))) 
{
    //out.writeObject(mapArray);
    //}
    //catch (IOException e) {
//}

在创建地图的类中,读取代码:

    try{
        FileInputStream door = new FileInputStream(new File(f.getPath()+ "//verticalroad.necro"));
        ObjectInputStream reader = new ObjectInputStream(door);
        homeTiles = (MapTile[][]) reader.readObject();
        }
    catch (IOException | ClassNotFoundException e)
        {
            System.out.println("Thrown an error" + e.getMessage());
        }

在初始化类中并根据需要进行注释。

然而。每次我运行程序时,二维数组(mapArray写入、homeTiles读取)的内容都是不同的。不仅和我(以为)我写的不同,而且每次打开程序都不同。

可以看出,我正在打印出toString进一步的System.out奇怪之处。由于它只是一个标准数组,toString它并不是 100% 有用,但它似乎在几个不同的值之间循环。但是,即使toStringg给出相同的值,显示的数组内容也不相同。

a 的一个示例toStringhometiles:[[Lriseofthenecromancer.MapTile;@7681720a 查看Array.toString( here ) 的文档,它似乎格式不正确,缺少尾随 ]。我不确定这是否是问题的线索,或者是否只是数组非常大(几千个对象)及其显示空间问题(我使用的是 NetBeans)。

任何关于为什么这种变化的见解将不胜感激。我的工作假设是它序列化数组而不是内容。但我不知道a)如果是这样,b)如果是这样,该怎么办。

编辑:进一步研究一下,似乎没有立即设置实例变量。在调用后直接将它们打印出来使setImage()它们全部为零,从调用类打印它们使它们位于应有的位置。

4

1 回答 1

-1

根本问题是我是个白痴。在这种特殊情况下的具体表达是我忘记了子类不能继承私有方法。因此,assignImage没有进行呼叫,也没有设置图像。

很抱歉浪费了任何看过这个的人的时间。我觉得很尴尬。

于 2013-06-27T02:32:01.890 回答