我正在序列化和反序列化一个大型二维对象数组。每个对象都包含创建 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 的一个示例toString
是hometiles:[[Lriseofthenecromancer.MapTile;@7681720a
查看Array.toString
( here ) 的文档,它似乎格式不正确,缺少尾随 ]。我不确定这是否是问题的线索,或者是否只是数组非常大(几千个对象)及其显示空间问题(我使用的是 NetBeans)。
任何关于为什么这种变化的见解将不胜感激。我的工作假设是它序列化数组而不是内容。但我不知道a)如果是这样,b)如果是这样,该怎么办。
编辑:进一步研究一下,似乎没有立即设置实例变量。在调用后直接将它们打印出来使setImage()
它们全部为零,从调用类打印它们使它们位于应有的位置。