复杂和巨大数据结构的Java序列化

时间:2011-07-26 02:20:44

标签: java serialization

我有一个模型,需要以某种方式写入磁盘并随后读取(制作一个简单的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.

2 个答案:

答案 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在这方面非常脆弱。