我有一个模型,需要以某种方式写入磁盘并随后读取(制作一个简单的Java 2D游戏)。现在,有一个对Player的引用,它有一大堆引用块和实体。在我的项目中有大量的实体和块,我真的不想写一个toString()/ encode()然后来自fromString()/ decode()......项目已经过期了,而且在这里4: 05 AM:p。
那么,在这种情况下,人类会做什么?在这里抓取并询问序列化的作用,以及它是否会立即生效。我在戏剧中,它必须在第一时间工作,没有太多的实验者空间,可悲的是。
以下情况需要完全写入磁盘。可以使用单个serialize()函数:o?
现在,想象一下这个虚构的课程(实际上我有5800行java代码和大量混合数据,这会伤害)(没有功能)(在我的脑海中):
class InventorySlot { Object[] list; Class type; int quantity; }
class Inventory { InventorySlot[] slots; }
class Player { int hp; Inventory inv,palette; double x,y; }
enum Block { air, stone, cobble, dirt, etc; }
class Entity { double x,y,dir,speed,h,w; /*AND CUSTOMS! (derivers)*/ }
class EntitySpriteAnimationPuf { Particle[] parts; final double friction, dir, dirnoise; Color color; } // final vars!
class World
{
List<Chunk> chunks; // have an infinite map. each chunk is 64x64 Blocks.
Entity[65535] entities; // I have a lot of entites, both types and later their instances.
}
class Model // target class to be entirely written down
{
Player p;
WindowManager wm; // Yes, i have my own GUI. Yes, it looks wonderful. Yes its got a lot of data... Yes, ouch.
World w; // got this manually written down.
Vector<String> terminal; // Dont want this to be serialized...
boolean guiactive, pause;
// And a few more...
}
// AND A LOT MORE. MORE. MORE. MORE. MORE. MORE. MORE. MORE. MORE. MORE. MORE. MORE. MORE.
答案 0 :(得分:2)
这是你需要做什么来加载/保存java对象(忽略异常处理)
确保所有类都实现Serializable接口
要知道的是,如果您更改了任何序列化类,那么
很可能你的“反序列化”会失败
public void load() {
FileInputStream filein = new FileInputStream("data");
ObjectInputStream in = new ObjectInputStream(filein);
Model model = (Model) in.readObject();
in.close();
}
public void save() {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data"));
out.writeObject(model);
out.close();
}
答案 1 :(得分:0)
如果您不想编写自己的序列化代码,那么kryo是Java Serializable
的更好替代方案。特别是如果考虑性能和序列化大小(听起来像是你的话)。
是的,你所要做的就是用kryo注册每个模型类,然后只需将对象图交给序列化。
如果您需要比自动序列化器(它仍然比Java更高效)更高效,您还可以为特定类添加单独的序列化器。
它(有点)对类和JVM版本更改更具抵抗力; Serializable
在这方面非常脆弱。