将表示XML的Java对象序列化为XML表单是否合适?

时间:2013-02-19 13:31:21

标签: java xml design-patterns serialization jaxb

我正在研究一些代表XML元素的Java对象。因为我正在使用的标准可能变得有点笨拙,所以我正在设计具有许多JAXB对象的组合(直接从.xsd生成)并提供易于使用的附加功能。

由于我在Java中表示的对象是实际的XML对象,将它们序列化为XML是否合适?如果没有,为什么这会是一个坏主意(除了表现原因)?

编辑:

我得到了一些“为什么你甚至想要这样做?”输入问题,让我解释一下。当对象的逻辑实现与其物理实现大不相同时,通常考虑自定义序列化表单(来自Bloch的Effective Java,第75项)。在我的例子中,物理形式与逻辑形式有很大不同,自定义序列表示是合适的。由于该对象总是能够用XML表示,所以它在逻辑上似乎很合适,但我试图用Java语言(I.E. performance)来理解它的含义。

4 个答案:

答案 0 :(得分:1)

我怀疑这是一个goid想法。 xml表示可能需要大约100倍于二进制代表所需的空间。在我使用xml doc序列化之前,我会使用java std序列化。 (这很舒服,但效率不高)

更适合的是一些二进制xml表示。喜欢BSON for JSon或Google protobuf。寻找二进制XML。

答案 1 :(得分:0)

  

由于我在Java中表示的对象是实际的XML对象,是否适合将它们序列化为XML?

我认为你的意思是像DOM一样。然后你使用一些XML绑定序列化...将DOM对象视为POJO !!

不好主意,IMO。

  

如果没有,为什么这会是一个坏主意(除了表现原因)?

  • 序列化和反序列化性能会很差。
  • 序列化表格会膨胀。
  • 生成的XML将无法读取。
  • 序列化很难处理其他任何事情。考虑尝试对它进行XSLT转换。考虑尝试使用基于事件的解析器来处理它。

实际上,我很难想到任何可能是个好主意的理由。


<强>更新

你的解释(在你的更新/评论中)为什么这样做是不能令人信服的:

  

当对象的逻辑实现与其物理实现大不相同时,通常需要考虑自定义序列化表单(来自Bloch的Effective Java,第75项)。

Bloch的建议是考虑使用自定义表示。并且隐含在这个假设中,您认为自定义表示比您面前的标准表示更好。

  

就我而言,物理形式与逻辑形式有很大不同,自定义序列表示是合适的。

这并不能解释为什么你想首先用XML表示DOM。或者为什么你认为它更好。

  

由于该对象总是能够用XML表示,所以它在逻辑上似乎很合适,...

你没有解释那个逻辑。

  

...但我正在尝试用Java语言(I.E. performance)来理解它的含义。

其影响正如我上面所解释的那样。而且没有任何Java特定的内容。


好的,让我们从另一个角度看这个。

  1. 您有一些信息。
  2. 您以XML格式表示该信息。
  3. 您解析XML以提供内存表示 - DOM。
  4. 您应用类似jaxb的内容来为您提供DOM的XML表示...被视为POJOS
  5. 您序列化DOM。
  6. 最终得到的Java对象的XML表示形式代表了一些表示原始信息的XML。

    这比原始信息的XML表示更好吗?

    现在,也许,如果在步骤3中你使用了jaxb并反序列化为自定义Java类......那么将这些Java类序列化是有意义的。但是你没有“代表XML元素的Java对象”。而是使用Java对象来表示由原始XML 表示的信息。

    这与您在问题中实际写的内容完全不同。如果这就是你的意思,它就解释了为什么人们不理解你......并且认为你实际上说的是什么做得很少/没有意义。

答案 2 :(得分:0)

您的意思是序列化为XML文件吗?一般认为,出于性能原因,这不是一个好主意,但是如果您打算将这些对象/ xml文件用作另一个系统的源,那么它可能值得考虑

答案 3 :(得分:0)

如果您的主要关注点是能够根据XSD中定义的规则验证对象,this是指向其工作方式的链接。鉴于此,请注意将对象编组为XML将花费您一些周期。其中一个重要的性能命中是创建用于编组对象的JAXB上下文。您可以通过在某种单例对象(PO​​JO,Spring bean等)中创建JAXB上下文来最小化此性能损失,因此不会每次都重新创建它。