【问题标题】:XML serialization in Java? [closed]Java中的XML序列化? [关闭]
【发布时间】:2010-09-07 08:08:31
【问题描述】:

.NET 的 XML 序列化的 Java 类似物是什么?

【问题讨论】:

  • 啊,光荣的旧时代,像这样的单行问题在 SO 上受到欢迎。太有用了。没有那些“你尝试过什么?”/“提供详细信息”的废话,人们今天喜欢阅读。

标签: java xml serialization


【解决方案1】:

如果您正在谈论对象的自动 XML 序列化,请查看 Castor

Castor 是一个用于 Java[tm] 的开源数据绑定框架。它是 Java 对象、XML 文档和关系表之间的最短路径。 Castor 提供 Java 到 XML 的绑定、Java 到 SQL 的持久性等等。

【讨论】:

    【解决方案2】:

    XStream 非常擅长将对象序列化为 XML,无需太多配置和金钱! (它在 BSD 许可下)。

    我们在我们的一个项目中使用它来替换普通的旧 java 序列化,它几乎是开箱即用的。

    【讨论】:

    • 非常有用,但它可能会在复杂的树结构上出现问题,例如带有非字符串节点对象的 JGraph。
    • 比其他解决方案更简单更好
    • 我喜欢 XStream。唯一的问题是我不明白为什么要在实际 XML 之前添加一个字符。
    • 刚试过。击败其他 7 个无法正确序列化和反序列化对象的 json 序列化程序。
    【解决方案3】:

    2008 年答案 用于此的“官方”Java API 现在是 JAXB - Java API for XML Binding。见Tutorial by Oracle。参考实现位于http://jaxb.java.net/

    2018 年更新 请注意the Java EE and CORBA Modules are deprecated in SE in JDK9 and to be removed from SE in JDK11。因此,要使用 JAXB,它需要位于您现有的企业类环境中,例如您的应用服务器,否则需要手动引入。

    【讨论】:

    • 没错,JAXB 绝对是最好的选择!
    • JAXB 自 Java 10 起已从标准 Java 发行版中删除,这使其现在成为一个库,如果需要,您必须将其与应用程序捆绑在一起,除非您在已经捆绑它的上下文中操作你。
    【解决方案4】:

    XMLBeans 如果您有 XML 架构,则效果很好。它为模式创建 Java 对象并创建易于使用的解析方法。

    【讨论】:

      【解决方案5】:

      如果我需要创建可序列化为 XML 的对象,我通常使用 jaxbXMLBeans。现在,我可以看到XStream 可能非常有用,因为它是非侵入式的并且具有非常简单的 api。我很快就会玩它,并且可能会使用它。我注意到的唯一缺点是我无法自己创建对象的 id 以进行交叉引用。

      @巴拉克·席勒
      感谢您发布 XStream 的链接!

      【讨论】:

      • 问题是 jaxb 和 xmlbeans 需要映射模式并且不是自动 ...
      【解决方案6】:

      “简单的XML序列化”项目

      您可能想查看Simple XML Serialization 项目。这是我在 .Net 中发现的最接近 System.Xml.Serialization 的东西。

      【讨论】:

      • 但是它确实需要为每个字段映射注释。
      • 不正确,我不需要。您可以更改默认行为,它将仅使用现有字段。
      • 我也衷心支持"Simple"。我已经在几个项目中使用它并取得了巨大的成功。 “简单”确实比 JAXB 简单得多。当您有相对简单的需求时最合适:获得需要写入存储的对象,以便稍后再次重新水合为对象。 JAXB 具有更多的功能和灵活性,但它是一种“80/20”类型的东西,大多数时候在大多数项目中您可能只需要简单的功能子集。
      • 如果您只想要 1:1 映射,效果很好。如果您的类不断发展,而您仍然需要反序列化旧的 XML,那么您就会遇到问题,因为文档和错误消息都有些模糊。诊断问题通常是可行的,但找出解决方法可能需要几天时间。
      【解决方案7】:

      别忘了JiBX

      【讨论】:

        【解决方案8】:

        JAXB 是 JDK 标准版 1.6+ 的一部分。所以它是FREE,没有额外的库可以下载和管理。 一个简单的例子可以找到here

        XStream 似乎已经死了。最后一次更新是在 2008 年 12 月 6 日。 Simple 看起来和 JAXB 一样简单易用,但我找不到任何许可信息来评估它以供企业使用。

        【讨论】:

        • XStream 并没有死,它只是成熟和稳定——这意味着核心功能没有什么可添加的。 JAXB 参考实现实际上也是如此,过去几年没有太多活动。
        • jaxb 糟透了 .. 我无法让它正常工作...... xstream 工作得更好......但是在类结构变化方面并不出色。
        【解决方案9】:

        如果您想要一个结构化解决方案(如 ORM),那么 JAXB2 是一个很好的解决方案。

        如果你想要像 DOT NET 这样的序列化,那么你可以使用Long Term Persistence of JavaBeans Components

        选择取决于序列化的使用。

        【讨论】:

          【解决方案10】:

          值得一提的是,从 1.4 版开始,Java 有了 java.beans.XMLEncoder 和 java.beans.XMLDecoder 类。这些类执行 XML 编码,这至少与 XML 序列化非常相似,并且在某些情况下可能会为您解决问题。

          如果您的类的 getter 和 setter 遵循 JavaBeans 规范,那么此方法使用起来很简单,并且您不需要模式。有以下注意事项:

          • 与普通 Java 序列化一样
            • 编码和解码运行在 InputStream 和 OutputStream 上
            • 进程使用熟悉的 writeObject 和 readObject 方法
          • 与普通 Java 序列化相比
            • 编码和解码都会导致调用构造函数和初始化程序
            • 无论您的类是否实现了 Serializable,编码和解码都可以工作
            • 不考虑瞬态修饰符
            • 仅适用于具有公共构造函数的公共类

          例如,采取以下声明:

          public class NPair {
            public NPair() { }
            int number1 = 0;
            int number2 = 0;
            public void setNumber1(int value) { number1 = value;}
            public int getNumber1() { return number1; }
            public void setNumber2(int value) { number2 = value; }
            public int getNumber2() {return number2;}
          }
          

          执行此代码:

          NPair fe = new NPair();
          fe.setNumber1(12);
          fe.setNumber2(13);
          FileOutputStream fos1 = new FileOutputStream("d:\\ser.xml");
          java.beans.XMLEncoder xe1 = new java.beans.XMLEncoder(fos1);
          xe1.writeObject(fe);
          xe1.close();
          

          会产生以下文件:

          <?xml version="1.0" encoding="UTF-8"?>
          <java version="1.7.0_02" class="java.beans.XMLDecoder">
           <object class="NPair">
            <void property="number1">
             <int>12</int>
            </void>
            <void property="number2">
             <int>13</int>
            </void>
           </object>
          </java>
          

          【讨论】:

          • 请注意,将java.beans.XMLDecoder 与用户提供的数据一起使用可能会在您的代码中引入任意代码执行漏洞。
          • 很多不必要的 XML 是由 XMLEncoder 类生成的。看看庞大的输出......
          【解决方案11】:
          public static String genXmlTag(String tagName, String innerXml, String properties )
          {
              return String.format("<%s %s>%s</%s>", tagName, properties, innerXml, tagName);
          }
          
          public static String genXmlTag(String tagName, String innerXml )
          {
              return genXmlTag(tagName, innerXml, "");
          }
          
          public static <T> String serializeXML(List<T> list)
          {
              String result = "";
              if (list.size() > 0)
              {
                  T tmp = list.get(0);
                  String clsName = tmp.getClass().getName();
                  String[] splitCls = clsName.split("\\.");
                  clsName = splitCls[splitCls.length - 1];
                  Field[] fields = tmp.getClass().getFields();
          
                  for (T t : list)
                  {
                      String row = "";
                      try {
                          for (Field f : fields)
                          {
                              Object value = f.get(t);
                              row += genXmlTag(f.getName(), value == null ? "" : value.toString());
                          }
                      } catch (IllegalAccessException e) {
                          e.printStackTrace();
                      }
                      row = genXmlTag(clsName, row);
          
                      result += row;
                  }
              }
          
              result = genXmlTag("root", result);
              return result;
          }
          

          【讨论】:

          • 很多问题:类#getSimpleName 的再发明 *** PropertyDescriptor 的再发明 *** 假设所有属性都是可访问的字段 *** 不缓存反射结果(慢) *** 无法自定义任何东西(例如,我需要替换类和文件名)*** 没有反序列化
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-22
          • 1970-01-01
          • 2012-12-26
          • 1970-01-01
          相关资源
          最近更新 更多