高效的java对象图序列化

时间:2009-04-04 13:35:07

标签: java serialization

序列化java对象图的最佳方法是什么?

我对序列化库的要求是 1)反序列化的速度 2)大小 - 尽可能小(小于java默认序列化) 3)灵活性 - 基于注释的必须序列化的定义会很好。

底层文件格式并不重要。

我查看了Protocol Buffers和XStream,但由于需要映射文件而后者生成大文件,前者不够灵活。

任何帮助表示感谢。

6 个答案:

答案 0 :(得分:2)

对于小对象,Java序列化表单很可能由序列化类的描述支配。

您可以为常用类写出序列化数据,然后将其用作一系列序列化流的通用前缀。请注意,这非常脆弱,您可能希望为每个类加载器实例重新计算并检查它。

答案 1 :(得分:1)

对于序列化,Hessian是效率最高的之一。

这比Java序列化小2-3倍,甚至使用Externalizable类。

无论您使用哪种序列化,都可以非常轻松地使用压缩来使数据更加紧凑。

除此之外,您还可以编写自己的序列化。我写了一个串行化器,它写入/来自ByteBuffer,大约是Hessian的两倍(大约比Java序列化大5倍/小)。如果现有的序列化可以满足你的需要,这可能会带来很大的收益。但是它可以随意定制;)

答案 2 :(得分:1)

我接下来关于压缩有用性的说明 - 所有格式压缩到大约相同,即更大的输出压缩更多。

除了这个和其他建议之外,JSON与Jackson的效果非常好:比XML(与PB,Hessian竞争)更快,更紧凑;比PB更灵活,易于与客户端JS集成(如果重要)并且容易出错。

答案 3 :(得分:0)

我认为默认的Java序列化将会非常小。您是否可以通过transient关键字限制要序列化的内容?这将解决您的第三个问题(灵活性和注释)

答案 4 :(得分:0)

http://jserial.sourceforge.net/会满足您的需求吗?

答案 5 :(得分:0)

您可以使用Databoard进行递归序列化。

它看起来像这样..

@Referable class Node {
    public int id;
    public Node[] reference;
    public Node(int id, Node...reference) {
        this.id = id;
        this.reference = reference;
    }

}

public static void main(String[] args) throws Exception {

    Node a = new Node(0);
    Node b = new Node(1);
    Node c = new Node(2);
    a.reference = new Node[] {b, c};
    b.reference = new Node[] {a};
    c.reference = new Node[] {c};

    Binding binding = Bindings.getBinding( Node.class );
    Serializer s = binding.serializer();
    byte[] data = s.serialize(a);

    Node d = (Node) s.deserialize( data );
    System.out.println( binding.toString(d) );
}