



Если вы говорите об автоматической 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, с объектами, не являющимися строковыми узлами.
Проще и лучше других решений
Мне нравится XStream. Единственное, что я не понимаю, почему символ добавляется перед фактическим XML.
2008 Ответ «Официальным» Java API для этого теперь является JAXB - Java API для привязки XML. См. Учебник от Oracle. Эталонная реализация живет по адресу http://jaxb.java.net/
Обновление 2018 Обратите внимание, что модули Java EE и CORBA устарели в SE в JDK9 и должны быть удалены из SE в JDK11. Следовательно, чтобы использовать JAXB, он должен быть либо в вашей существующей среде корпоративного класса, связанной, например, с вашим. app server, или вам нужно будет ввести его вручную.
Правильно, JAXB определенно лучший вариант!
JAXB был удален из стандартных java-дистрибутивов начиная с Java 10, что делает его теперь библиотекой, которую вы должны связать с вашим приложением, если хотите, если вы не работаете в контексте, который уже связывает его для вас.
XMLBeans отлично работает, если у вас есть схема для вашего XML. Он создает объекты Java для схемы и создает простые в использовании методы синтаксического анализа.
Обычно я использую jaxb или XMLBeans, если мне нужно создать объекты, сериализуемые в XML. Теперь я вижу, что XStream может быть очень полезным, поскольку он ненавязчив и имеет очень простой api. Я скоро поиграю с ним и, наверное, воспользуюсь. Единственный недостаток, который я заметил, - это то, что я не могу самостоятельно создать идентификатор объекта для перекрестных ссылок.
@Barak Schiller
Спасибо, что разместили ссылку на XStream!
Проблема в том, что jaxb и xmlbeans требуют схемы сопоставления и не авто ...
Вы можете посмотреть проект Простая сериализация XML. Это самое близкое, что я нашел к System.Xml.Serialization в .Net.
Однако для каждого поля требуются аннотации сопоставления.
Неправда, мне не требуется. Вы можете изменить поведение по умолчанию, и оно будет использовать только существующие поля.
Я также искренне поддерживаю "Простой". Я с большим успехом использовал его в нескольких проектах. «Простой» действительно много проще, чем JAXB. Наиболее подходит, когда у вас относительно простые потребности: есть объекты, которые нужно записать в хранилище, чтобы впоследствии снова преобразовать их в объекты. JAXB имеет гораздо больше возможностей и гибкости, но это что-то вроде «80/20», большую часть времени в большинстве проектов вам может понадобиться только простое подмножество функций.
Хорошо работает, если вам просто нужно отображение 1: 1. Если ваши классы развиваются и вам все еще нужно десериализовать старый XML, вы столкнетесь с проблемами, потому что и документация, и сообщения об ошибках несколько расплывчаты. Диагностика проблемы обычно возможна, но выяснение того, как ее исправить, может занять несколько дней.
Не забывайте JiBX.
JAXB является частью стандартной редакции JDK версии 1.6+. Так что это FREE и никаких дополнительных библиотек для загрузки и управления.
Простой пример можно найти здесь
XStream вроде мертв. Последнее обновление было 6 декабря 2008 г.
Simple кажется таким же простым и простым, как JAXB, но я не смог найти никакой информации о лицензировании, чтобы оценить его для корпоративного использования.
XStream не мертв, он просто зрелый и стабильный, а это означает, что нечего добавить к основным функциям. На самом деле то же самое верно и для эталонной реализации JAXB, не так много активности за последние пару лет.
если вам нужен структурированное решение (например, ORM), тогда JAXB2 - хорошее решение.
Если вам нужна сериализация, такая как DOT NET, вы можете использовать Долгосрочное сохранение компонентов JavaBeans
Выбор зависит от использования сериализации.
Стоит отметить, что начиная с версии 1.4 в Java были классы java.beans.XMLEncoder и java.beans.XMLDecoder. Эти классы выполняют кодирование XML, которое, по крайней мере, очень похоже на сериализацию XML и в некоторых случаях может помочь вам.
Если ваш класс придерживается спецификации JavaBeans для своих геттеров и сеттеров, этот метод прост в использовании и вам не нужна схема. Со следующими оговорками:
Например, возьмите следующее объявление:
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 с данными, предоставленными пользователем, может привести к уязвимости выполнения произвольного кода в вашем коде.
Класс XMLEncoder генерирует много ненужного XML. Вы только посмотрите на громоздкую продукцию ...
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) *** Нет возможности настраивать что-либо (например, мне нужно заменить имена классов и файлов) *** Без десериализации
Ах, славные старые времена, когда однострочные вопросы, подобные этому, приветствовались на SO. Так полезно. Без всей этой ерунды типа «Что ты пробовал?» / «Расскажите подробности» люди любят читать сегодня.