Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 序列化过程中二维数组的更改_Java_Arrays_Serialization_Deserialization - Fatal编程技术网

Java 序列化过程中二维数组的更改

Java 序列化过程中二维数组的更改,java,arrays,serialization,deserialization,Java,Arrays,Serialization,Deserialization,我正在序列化和反序列化一个大的二维对象数组。每个对象都包含创建BufferedImage的说明-这样做是为了避免BufferedImage本身不可直接序列化 正在序列化的类是: public final class MapTile extends TransientImage { private static final long serialVersionUID = 0; private transient BufferedImage f; transient Buff

我正在序列化和反序列化一个大的二维对象数组。每个对象都包含创建
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
,读取时为
homepiles
)都是不同的。不仅和我写的不同,而且每次打开程序都不同

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

toString
的一个例子是
hometiles:[[lRiseOfNeromancer.MapTile;@7681720a
查看
数组的文档。toString
()似乎格式不正确,缺少尾随)。我不确定这是问题的线索,还是数组非常大(数千个对象)这是一个显示空间的问题(我正在使用NetBeans)

我的工作假设是序列化数组而不是内容。但我不知道a)如果是这样,b)如果是这样,该怎么办


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

根本的问题是我是个白痴。在这种特殊情况下,这种情况的具体表现是我忘记了子类不能继承私有方法。因此,
assignImage
调用没有进行,并且imag他没有被陷害


很抱歉浪费了看这篇文章的人的时间。我感到很尴尬。

哎呀,谢谢你在那里的打字错误@Jim Garrison如果你在发布之前注意正确设置代码格式(正确缩进,删除制表符),你会得到更多的关注。你的
toString()在哪里
对于
MapTile
?您是否尝试过编写
toString()
并查看内容是否实际发生了更改?抱歉,我不确定是否理解您的意思。您的意思是我是否尝试过在
MapTile
类中覆盖
toString()
?还是我尝试过调用(默认)toString()在我的代码中的某个地方检查它的值?