序列化期间二维数组的变化

时间:2013-06-26 21:37:06

标签: java arrays serialization deserialization

我正在对大型二维对象数组进行序列化和反序列化。每个对象都包含创建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)的内容都不同。不仅与我写的那个(思想)不同,而且每次打开程序时也不同。

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

toString的一个示例是hometiles:[[Lriseofthenecromancer.MapTile;@7681720a查看Array.toStringhere)的文档,它似乎形成得很糟糕,缺少尾随]。我不确定这是否是该问题的线索,或者它是否仅仅是数组非常大(数千个对象)以及它是显示空间的问题(我正在使用NetBeans)。

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

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

1 个答案:

答案 0 :(得分:-1)

潜在的问题是我是个白痴。在这个特殊情况下,这个特定表达式是我忘了子类不能继承私有方法。因此,未进行assignImage来电并且未设置图像。

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