序列化java对象图的最佳方法是什么?
我对序列化库的要求是 1)反序列化的速度 2)大小 - 尽可能小(小于java默认序列化) 3)灵活性 - 基于注释的必须序列化的定义会很好。
底层文件格式并不重要。
我查看了Protocol Buffers和XStream,但由于需要映射文件而后者生成大文件,前者不够灵活。
任何帮助表示感谢。
答案 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) );
}