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

Что представляет собой Java-аналог сериализации XML в .NET?

Ах, славные старые времена, когда однострочные вопросы, подобные этому, приветствовались на SO. Так полезно. Без всей этой ерунды типа «Что ты пробовал?» / «Расскажите подробности» люди любят читать сегодня.

GOTO 0 22.05.2017 15:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
104
1
139 575
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

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

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.

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

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

Очень полезно, но могут возникнуть проблемы со сложными древовидными структурами, такими как Graph, с объектами, не являющимися строковыми узлами.

mikek3332002 03.06.2010 08:22

Проще и лучше других решений

daitangio 22.10.2010 19:57

Мне нравится XStream. Единственное, что я не понимаю, почему символ добавляется перед фактическим XML.

James P. 15.01.2013 23:20
Ответ принят как подходящий

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

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

Правильно, JAXB определенно лучший вариант!

ivan_ivanovich_ivanoff 09.04.2009 20:55

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

Theodore Murdock 29.06.2018 22:03

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

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

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

Проблема в том, что jaxb и xmlbeans требуют схемы сопоставления и не авто ...

mP. 14.04.2011 07:53

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

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

Однако для каждого поля требуются аннотации сопоставления.

mP. 14.04.2011 09:36

Неправда, мне не требуется. Вы можете изменить поведение по умолчанию, и оно будет использовать только существующие поля.

Konstantin Milyutin 25.04.2011 00:14

Я также искренне поддерживаю "Простой". Я с большим успехом использовал его в нескольких проектах. «Простой» действительно много проще, чем JAXB. Наиболее подходит, когда у вас относительно простые потребности: есть объекты, которые нужно записать в хранилище, чтобы впоследствии снова преобразовать их в объекты. JAXB имеет гораздо больше возможностей и гибкости, но это что-то вроде «80/20», большую часть времени в большинстве проектов вам может понадобиться только простое подмножество функций.

Basil Bourque 23.07.2015 23:35

Хорошо работает, если вам просто нужно отображение 1: 1. Если ваши классы развиваются и вам все еще нужно десериализовать старый XML, вы столкнетесь с проблемами, потому что и документация, и сообщения об ошибках несколько расплывчаты. Диагностика проблемы обычно возможна, но выяснение того, как ее исправить, может занять несколько дней.

toolforger 23.05.2019 10:39

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

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

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

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

StaxMan 08.01.2011 01:14

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

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

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

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

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

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

Имейте в виду, что использование java.beans.XMLDecoder с данными, предоставленными пользователем, может привести к уязвимости выполнения произвольного кода в вашем коде.

aventurin 10.09.2018 10:44

Класс XMLEncoder генерирует много ненужного XML. Вы только посмотрите на громоздкую продукцию ...

Noor ul Ain 18.01.2021 17:26

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

Множество проблем: Переосмысление класса # getSimpleName *** Переосмысление PropertyDescriptor *** Предполагается, что все свойства являются доступными полями *** Не кэширует результаты отражения (slooow) *** Нет возможности настраивать что-либо (например, мне нужно заменить имена классов и файлов) *** Без десериализации

toolforger 28.12.2017 09:07

Другие вопросы по теме