Сериализация XML в Java? - программирование
Подтвердить что ты не робот

Сериализация XML в Java?

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

4b9b3361

Ответ 1

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

Ответ 2

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

Мы использовали его в одном из наших проектов, чтобы заменить обычную старую java-сериализацию, и она работала почти из коробки.

Ответ 3

Проект "Простое XML-сериализация"

Вы можете посмотреть проект Simple XML Serialization. Это самая близкая вещь, которую я нашел в System.Xml.Serialization в .Net.

Ответ 4

JAXB входит в стандартную версию JDK версии 1.6+. Таким образом, это FREE и никаких дополнительных библиотек для загрузки и управления. Простой пример можно найти здесь

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

Ответ 5

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

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

  • Как и при обычной сериализации Java
    • кодирование и декодирование выполняются через InputStream и OutputStream
    • процесс использует методы writeObject для familar и 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;}
}

Выполнение этого кода:

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>

Ответ 6

XMLBeans отлично работает, если у вас есть схема для вашего XML. Он создает объекты Java для схемы и создает простые в использовании методы анализа.

Ответ 7

Если вы говорите об автоматической сериализации объектов XML, посмотрите Castor:

Castor - это структура привязки данных с открытым исходным кодом для Java [tm]. Это кратчайший путь между объектами Java, XML-документами и реляционными таблицами. Castor обеспечивает привязку Java-to-XML, сохранение на Java-SQL и многое другое.

Ответ 8

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

@Барак Шиллер
Спасибо, что разместили ссылку на XStream!

Ответ 9

Не забывайте JiBX.

Ответ 10

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

Если вы хотите сериализовать, например, DOT NET, вы можете использовать Долгосрочное сохранение компонентов JavaBeans

Выбор зависит от использования сериализации.

Ответ 11

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