English 中文(简体)
Java中的XML序列化?[已关闭]
原标题:
  • 时间:2008-08-30 08:33:01
  •  标签:

我们不允许为书籍、工具、软件库等寻求推荐的问题。你可以编辑问题,这样就可以用事实和引文来回答问题。

Closed 4 years ago.

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

最佳回答

2008 Answer The "Official" Java API for this is now JAXB - Java API for XML Binding. See Tutorial by Oracle. The reference implementation lives at http://jaxb.java.net/

2018 Update Note that the Java EE and CORBA Modules are deprecated in SE in JDK9 and to be removed from SE in JDK11. Therefore, to use JAXB it will either need to be in your existing enterprise class environment bundled by your e.g. app server, or you will need to bring it in manually.

问题回答

XStream非常擅长将对象序列化为XML,而不需要太多配置和资金!(它是在BSD许可证下)。

我们在一个项目中使用了它来取代简单的旧java序列化,它几乎开箱即用。

"Simple XML Serialization" Project

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

JAXB is part of JDK standard edition version 1.6+. So it is FREE and no extra libraries to download and manage. A simple example can be found here

XStream seems to be dead. Last update was on Dec 6 2008. Simple seems as easy and simpler as JAXB but I could not find any licensing information to evaluate it for enterprise use.

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

如果您的类在getter和setter方面坚持JavaBeans规范,那么这个方法使用起来很简单,不需要模式。有以下注意事项:

  • As with normal Java serialization
    • coding and decoding run over a InputStream and OutputStream
    • the process uses the familar writeObject and readObject methods
  • In contrast to normal Java serialization
    • the encoding but also decoding causes constructors and initializers to be invoked
    • encoding and decoding work regardless if your class implements Serializable or not
    • transient modifiers are not taken into account
    • works only for public classes, that have public constructors

例如,以以下声明为例:

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>

XMLBeans如果您有一个XML架构,它会非常有效。它会为架构创建Java对象,并创建易于使用的解析方法。

如果您正在讨论对象的自动XML序列化,请查看脚轮

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

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

@Barak Schiller
Thanks for posting link to XStream!

别忘了JiBX

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

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

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

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;
}




相关问题
热门标签