请注意,Java EE和CORBA模块已在JDK9中的SE中弃用,并已从JDK11中的"/>

Java中的XML序列化?

Java中的XML序列化?

XML serialization in Java?

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


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

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


XStream非常擅长将对象序列化为XML,而无需进行大量配置和花费! (已获得BSD许可)。

我们在一个项目中使用它来替换普通的旧Java序列化,并且它几乎可以立即使用。


"简单XML序列化"项目

您可能需要查看简单XML序列化项目。这是我在.Net中找到的最接近System.Xml.Serialization的东西。


JAXB是JDK标准版本1.6+的一部分。因此它是FREE,没有其他库可供下载和管理。
一个简单的例子可以在这里找到

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


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

如果您的类的getter和setter遵循JavaBeans规范,则此方法易于使用,并且不需要架构。有以下警告:

  • 与普通的Java序列化一样

    • 编码和解码在InputStream和OutputStream上运行
    • 该过程使用熟悉的writeObject和readObject方法
  • 与普通的Java序列化相反

    • 编码和解码也会导致构造函数和初始化程序被调用
    • 不管您的类是否实现了可序列化,编码和解码均有效
    • 不考虑瞬态修饰符
    • 仅适用于具有公共构造函数的公共类

例如,采用以下声明:

1
2
3
4
5
6
7
8
9
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;}
}

执行此代码:

1
2
3
4
5
6
7
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();

将导致以下文件:

1
2
3
4
5
6
7
8
9
10
11
<?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>

如果您有用于XML的架构,那么XMLBeans可以很好地工作。它为模式创建Java对象,并创建易于使用的解析方法。


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

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

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


不要忘记JiBX。


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

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


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

Castor is an Open Source data binding framework for Java[tm]. It's the shortest path between Java objects, XML documents and relational tables. Castor provides Java-to-XML binding, Java-to-SQL persistence, and more.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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;
}


推荐阅读

    linux时间命令教程?

    linux时间命令教程?,时间,系统,信息,国家,电脑,大陆,标准,中国,命令,终端,LIN

    linux命令工具教程?

    linux命令工具教程?,系统,工具,信息,基础,基础知识,代码,在线,地址,项目,服

    linux进阶命令教程?

    linux进阶命令教程?,系统,设备,软件,网络,代码,基础,资料,概念,工具,环境,浅

    linux命令行端教程?

    linux命令行端教程?,系统,工具,基础,基础知识,终端,地址,信息,概念,在线,综

    linux命令入门教程?

    linux命令入门教程?,基础,网络,管理,系统,第一,基础知识,服务,命令,软件,工

    linux模块化加载命令?

    linux模块化加载命令?,软件,系统,设备,代码,信息,环境,适当,资料,网上,电脑,

    linux简化命令教程?

    linux简化命令教程?,地址,工作,系统,信息,命令,目录,代码,标准,控制台,文件,L

    linux模拟命令ls?

    linux模拟命令ls?,系统,地址,工作,命令,时间,基础,标准,信息,文件,目录,LS(LI

    linux命令加载模块?

    linux命令加载模块?,设备,系统,工具,检测,信息,模块,内核,文件,命令,杂项,lin

    linux命令行新手教程?

    linux命令行新手教程?,系统,基础,管理,基础知识,天通,概念,发行,环境,技术,

    linux7网卡绑定命令?

    linux7网卡绑定命令?,网络,系统,状态,地址,设备,信息,情况,网卡,模式,命令,Li

    linux必学的命令教程?

    linux必学的命令教程?,系统,工作,地址,命令,基础,管理,信息,数据,单位,标准,l

    linux在线模拟器命令?

    linux在线模拟器命令?,系统,设备,管理,命令,软件,数据,在线,网络,环境,盘中,l

    linux命令解压教程?

    linux命令解压教程?,系统,平台,工具,命令,文件,管理,标准,电脑,软件,名称,lin

    linux命令模拟软件?

    linux命令模拟软件?,软件,系统,地址,平台,电脑,环境,网上,工具,名字,名称,win

    菜鸟教程linux命令?

    菜鸟教程linux命令?,管理,系统,位置,数据,网络,环境,时间,情况,网上,磁盘,Lin

    Python网络爬虫教程

    Python网络爬虫教程,网络,代码,数据,爬虫,体系,设计,网站,时间,培训,智能,Py