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

将表示XML的Java对象序列化为其XML形式是否合适?,java,xml,design-patterns,serialization,jaxb,Java,Xml,Design Patterns,Serialization,Jaxb,我正在研究一些表示XML元素的Java对象。因为我目前使用的标准可能会变得有点笨拙,所以我正在使用大量JAXB对象(直接从.xsd生成)设计组合,并提供额外的功能以便于使用 因为我在Java中表示的对象是实际的XML对象,所以将它们序列化为XML是否合适?如果不是,为什么这是一个坏主意(除了性能原因) 编辑: 我收到了一些“你为什么要这么做?”类型的问题,让我解释一下。当对象的逻辑实现与物理实现(布洛赫的有效java,项目75)大不相同时,考虑定制序列化窗体通常是合适的。在我的例子中,物理形式将

我正在研究一些表示XML元素的Java对象。因为我目前使用的标准可能会变得有点笨拙,所以我正在使用大量JAXB对象(直接从.xsd生成)设计组合,并提供额外的功能以便于使用

因为我在Java中表示的对象是实际的XML对象,所以将它们序列化为XML是否合适?如果不是,为什么这是一个坏主意(除了性能原因)

编辑:


我收到了一些“你为什么要这么做?”类型的问题,让我解释一下。当对象的逻辑实现与物理实现(布洛赫的有效java,项目75)大不相同时,考虑定制序列化窗体通常是合适的。在我的例子中,物理形式将与逻辑形式显著不同,并且自定义串行表示是合适的。由于对象总是能够用XML表示,因此在逻辑上似乎很合适,但我正试图用Java语言理解这一点的含义(即性能)。

我怀疑这是一个好主意。xml表示可能需要大约100倍于二进制表示所需的空间。在使用xml文档序列化之前,我将使用java std序列化。(舒适但不高效)

更合适的是一些二进制xml表示。比如BSON for JSon或Google protobuf。查找二进制XML

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

我猜你指的是类似于DOM的东西。然后使用一些XML绑定进行序列化。。。将DOM对象视为POJO

坏主意,依我看

如果不是,为什么这是一个坏主意(除了性能原因)

  • 序列化和反序列化性能将很差
  • 序列化的表单将膨胀
  • 生成的XML将无法读取
  • 序列化将很难处理任何其他内容。考虑尝试对它进行XSLT转换。考虑使用基于事件的解析器来处理它。
事实上,我正在努力思考这可能是个好主意的任何理由


更新

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

当对象的逻辑实现与其物理实现大不相同(布洛赫的有效java,项目75)时,考虑定制序列化窗体通常是合适的。

布洛赫的建议是考虑使用自定义表示。其中隐含的是,假设你认为一个更好的自定义表示比你前面的标准表示。

在我的例子中,物理形式将与逻辑形式显著不同,并且自定义串行表示是合适的

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

由于对象始终能够用XML表示,因此它在逻辑上似乎非常适合

你还没有解释这个逻辑

。。。但我试图用Java语言来理解这一点的含义(即性能)

正如我上面解释的那样。关于这一点,Java没有什么特别的


好的,让我们从另一个角度来看这个问题

  • 你有一些信息
  • 您可以用XML表示这些信息
  • 您可以解析XML以提供内存中的表示—DOM
  • 您可以应用jaxb之类的东西来提供DOM的XML表示。。。被视为pojo
  • 您可以序列化DOM
  • 最终得到的是Java对象的XML表示,这些对象表示一些表示原始信息的XML

    这如何比原始信息的XML表示更好

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


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

    你是说序列化为XML文件吗?一般认为,出于性能原因,这不是一个好主意,但是,如果您打算将这些对象/xml文件用作另一个系统的提要,那么如果您主要关心的是能够根据XSD中定义的规则验证对象,则可能值得考虑,是一个如何工作的链接。有鉴于此,请注意将对象编组为XML将花费一些周期。一个重要的性能影响是创建JAXB上下文,您将使用它来封送对象。您可以通过在某种单例对象(POJO、Springbean等)中创建JAXB上下文来最大限度地降低这种性能影响,这样就不会每次都重新创建它。

    您所说的“实际XML对象”是什么意思?JAX-B可以序列化大多数java对象。。。是否需要它来满足您的业务需求?您不想不必要地封送和解封送,因为正如您所说的,这很昂贵。例如,Java中的SOAP对象表示XML—该对象应该始终能够用它实现的XML标准表示。至于JAXB部分,我正在使用一个包含JAXB元素的组合,这些元素表示