Java中的XML序列化?

Dmi*_*man 102 java xml serialization

.NET的XML序列化的Java模拟是什么?

Che*_*oft 80

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

2018年更新 请注意,JDK9中的SE中不推荐使用Java EE和CORBA模块,而是在JDK11中从SE中删除.因此,要使用JAXB,它将需要位于您的例如应用服务器捆绑的现有企业级环境中,或者您需要手动将其引入.

  • 没错,JAXB绝对是最好的选择! (2认同)

Bar*_*ler 69

XStream非常擅长将对象序列化为XML而没有太多配置和资金!(它是在BSD许可下).

我们在我们的一个项目中使用它来替换普通的旧java-serialization,它几乎开箱即用.

  • 非常有用,它可能在complecated树结构上有问题,例如JGraph与非字符串节点对象. (3认同)

ARK*_*BAN 17

"简单的XML序列化"项目

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


so_*_*_mv 13

JAXB是JDK标准版1.6+的一部分.所以它是FREE没有额外的库来下载和管理.这里有一个简单的例子

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

  • XStream并没有死,它只是成熟和稳定 - 这意味着没有太多可以添加到核心功能.对于JAXB参考实现也是如此,过去几年没有太多活动. (4认同)

Mis*_*hax 9

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

如果您的类坚持JavaBeans规范的getter和setter,这个方法很容易使用,您不需要架构.有以下警告:

  • 与普通的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;}
}
Run Code Online (Sandbox Code Playgroud)

执行此代码:

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();
Run Code Online (Sandbox Code Playgroud)

会导致以下文件:

<?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>
Run Code Online (Sandbox Code Playgroud)