Сериализация XML в Java?[закрыто]
-
09-06-2019 - |
Вопрос
Что такое Java-аналог XML-сериализации .NET?
Решение
Ответ 2008 года & Quot; Официально " Java API для этого теперь является JAXB - Java API для привязки XML. См. учебное руководство от Oracle . Ссылочная реализация находится по адресу http://jaxb.java.net/
Обновление 2018 года Обратите внимание, что модули Java EE и CORBA устарели в SE в JDK9 и будут удалены из SE в JDK11 а>. Следовательно, чтобы использовать JAXB, он должен либо находиться в существующей среде корпоративного класса, связанной с вашей, например, сервер приложений, или вам нужно будет ввести его вручную.
Другие советы
XStream очень хорош в сериализации объекта в XML без особых настроек и денег! (это по лицензии BSD).
Мы использовали его в одном из наших проектов, чтобы заменить простую старую java-сериализацию, и она работала практически из коробки.
" простая сериализация XML " Проект
Возможно, вы захотите взглянуть на проект Simple XML Serialization . Это самая близкая вещь, которую я нашел к System.Xml.Serialization в .Net.
JAXB является частью стандартной версии JDK 1.6+. Так что это БЕСПЛАТНО
и никаких дополнительных библиотек для загрузки и управления.
Простой пример можно найти здесь
XStream, кажется, мертв. Последнее обновление было 6 декабря 2008 г.
Simple
выглядит так же просто и просто, как JAXB, но я не смог найти никакой информации о лицензировании, чтобы оценить ее для корпоративного использования.
Стоит упомянуть, что начиная с версии 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>
XMLBeans прекрасно работает, если у вас есть схема для вашего XML. Он создает объекты Java для схемы и создает простые в использовании методы синтаксического анализа. Р>
Если вы говорите об автоматической сериализации объектов в формате XML, ознакомьтесь с Castor :
Castor - это инфраструктура привязки данных с открытым исходным кодом для Java [tm]. Это кратчайший путь между объектами Java, документами XML и реляционными таблицами. Castor обеспечивает привязку Java-XML, постоянство Java-SQL и многое другое.
Обычно я использую jaxb или XMLBeans , если мне нужно создать объекты, сериализуемые в XML. Теперь я вижу, что XStream может быть очень полезным, поскольку он неинтрузивный и имеет действительно простой API. Я скоро поиграюсь с этим и, вероятно, буду им пользоваться. Единственный недостаток, который я заметил, это то, что я не могу создать идентификатор объекта самостоятельно для перекрестных ссылок. Р>
@ Барак Шиллер
Спасибо за размещение ссылки на 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;
}