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


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

11 96

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+. Так оно и есть FREE и никаких дополнительных библиотек для загрузки и управления. Простой пример можно найти здесь

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

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

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

  • как с обычная сериализация Java
    • кодирование и декодирование выполняется по входному потоку и выходному потоку
    • процесс использует методы 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:

Castor-это платформа привязки данных с открытым исходным кодом для Java[tm]. Это самый короткий путь между объектами Java, XML-документами и реляционными таблицами. Касторовое предоставляет 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;
}