我正在对大型二维对象数组进行序列化和反序列化。每个对象都包含创建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
给出相同的值,显示的数组内容也不相同。
toString
的一个示例是hometiles:[[Lriseofthenecromancer.MapTile;@7681720a
查看Array.toString
(here)的文档,它似乎形成得很糟糕,缺少尾随]。我不确定这是否是该问题的线索,或者它是否仅仅是数组非常大(数千个对象)以及它是显示空间的问题(我正在使用NetBeans)。
任何有关为何如此变化的见解将不胜感激。我的工作假设是它序列化数组而不是内容。但我不知道a)如果是这样的话,b)如果是,那该怎么办。
编辑:进一步研究一下,似乎没有立即设置实例变量。在调用setImage()
之后直接将它们打印出来,将它们全部置于零,从调用类中打印它们将它们放在应有的位置。
答案 0 :(得分:-1)
潜在的问题是我是个白痴。在这个特殊情况下,这个特定表达式是我忘了子类不能继承私有方法。因此,未进行assignImage
来电并且未设置图像。
很抱歉浪费时间与任何看过这个的人在一起。我觉得很尴尬。