Сериализация XML в Java? [закрытый]

Что такое Java-аналог XML-сериализации .NET?

11 ответов


ответ 2008 "Официальный" Java API для этого теперь JAXB-Java API для привязки XML. См.учебник по Oracle. Эталонная реализация живет в http://jaxb.java.net/

обновить 2018 Обратите внимание, что модули Java EE и CORBA устарели в SE в JDK9 и должны быть удалены из SE в JDK11. Поэтому для использования JAXB он должен быть либо в существующей среде корпоративного класса в комплекте например, сервер приложений, или вам нужно будет ввести его вручную.


кинокомпании xStream довольно хорошо сериализует объект в XML без большой конфигурации и денег! (под лицензией BSD).

мы использовали его в одном из наших проектов для замены простой старой Java-сериализации, и он работал почти из коробки.



JAXB является частью JDK standard edition версии 1.6+. Так оно и есть!--0--> и никаких дополнительных библиотек для загрузки и управления. Простой пример можно найти здесь

XStream кажется мертвым. Последнее обновление было 6 декабря 2008. Simple кажется таким же простым и простым, как JAXB, но я не смог найти никакой информации о лицензировании, чтобы оценить ее для корпоративного использования.


стоит отметить, что начиная с версии 1.4 Java имела классы java.зернышки.XMLEncoder и java.зернышки.XMLDecoder. Эти классы выполняют кодировку XML, которая, по крайней мере, очень сопоставима с сериализацией XML и в некоторых случаях может сделать трюк для вас.

Если ваш класс придерживается спецификации JavaBeans для геттеров и сеттеров, этот метод прост в использовании и вам не нужны схемы. Со следующими оговорками:

  • как с нормальной сериализации Java
    • кодирование и декодирование выполняется через InputStream и OutputStream
    • процесс использует методы familar writeObject и readObject
  • в отличие от обычной сериализации Java
    • кодировка, но и декодирование вызывает конструкторы и инициализаторы для вызова
    • кодирование и декодирование работают независимо от того, реализует ли ваш класс сериализуемый или нет
    • переходные модификаторы не принимаются во внимание
    • работает только для общедоступных классов, которые имеют общедоступные конструкторы

например, возьмите следующее объявление:

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 и многое другое.


обычно я использую в JAXB или XMLBeans если мне нужно создать объекты сериализовать в XML. Теперь я вижу, что кинокомпании xStream может быть очень полезно, Так как это неинтрузивно и имеет очень простой api. Я скоро поиграю с ним и, возможно, воспользуюсь им. Единственный недостаток, который я заметил, заключается в том, что я не могу создать идентификатор объекта самостоятельно для перекрестных ссылок.

@Barak Schiller
Спасибо за публикацию ссылки на XStream!


Не забудьте JiBX.


Если вы хотите структурированные решения (например, ORM), тогда JAXB2-хорошее решение.

Если вы хотите сериализацию, такую как DOT NET, вы можете использовать долгосрочная стойкость компонентов 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;
}