104

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

4

11 回答 11

83

2008 回答 “官方”Java API 现在是 JAXB - 用于 XML 绑定的 Java API。请参阅Oracle 教程。参考实现位于http://jaxb.java.net/

2018 更新 请注意,Java EE 和 CORBA 模块在 JDK9 的 SE 中已弃用,并将从 JDK11 的 SE 中删除。因此,要使用 JAXB,它要么需要位于您现有的企业级环境中,并由您的例如应用服务器捆绑,要么您需要手动引入它。

于 2008-08-30T09:31:57.530 回答
71

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

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

于 2008-08-30T08:55:00.350 回答
17

“简单的 XML 序列化”项目

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

于 2009-01-22T14:01:01.837 回答
13

JAXB 是 JDK 标准版 1.6+ 的一部分。因此FREE,无需下载和管理额外的库。一个简单的例子可以在这里找到

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

于 2010-11-01T08:16:19.117 回答
8

值得一提的是,从 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>
于 2013-09-08T08:12:05.620 回答
2

如果您的 XML 有一个模式,那么XMLBeans非常有用。它为模式创建 Java 对象并创建易于使用的解析方法。

于 2008-08-30T11:39:16.880 回答
0

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

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

于 2008-08-30T08:49:34.433 回答
0

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

@Barak Schiller
感谢您发布指向 XStream 的链接!

于 2008-08-31T11:19:06.657 回答
0

不要忘记JiBX

于 2009-05-29T17:02:14.787 回答
0

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

如果您想要像 DOT NET 这样的序列化,那么您可以使用JavaBeans 组件的长期持久性

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

于 2011-03-31T21:28:37.293 回答
-1
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;
}
于 2014-09-24T07:59:52.977 回答