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()在我的代码中的某个地方检查它的值?