Что представляет собой Java-аналог сериализации XML в .NET?
Что представляет собой Java-аналог сериализации XML в .NET?
Ответы:
Ответ 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-сериализацию, и он работал почти сразу же.
Вы можете взглянуть на проект Simple XML Serialization . Это самое близкое, что я нашел к System.Xml.Serialization в .Net.
JAXB является частью стандартной версии JDK 1.6+. Так оно и есть, FREE
и никаких дополнительных библиотек для загрузки и управления. Простой пример можно найти здесь
XStream вроде мертв. Последнее обновление было 6 декабря 2008 г.
Simple
кажется таким же простым и простым, как JAXB, но я не смог найти никакой информации о лицензировании, чтобы оценить его для корпоративного использования.
Стоит отметить, что начиная с версии 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
данных, предоставленных пользователем, может привести к уязвимости выполнения произвольного кода в вашем коде.
XMLBeans отлично работает, если у вас есть схема для XML. Он создает объекты Java для схемы и создает простые в использовании методы синтаксического анализа.
Если вы говорите об автоматической XML-сериализации объектов, посмотрите Castor :
Castor - это среда привязки данных с открытым исходным кодом для Java [tm]. Это кратчайший путь между объектами Java, документами XML и реляционными таблицами. Castor обеспечивает привязку Java-to-XML, постоянство Java-to-SQL и многое другое.
Обычно я использую jaxb или XMLBeans, если мне нужно создать объекты, сериализуемые в XML. Теперь я вижу, что XStream может быть очень полезным, поскольку он ненавязчив и имеет очень простой api. Я скоро поиграю с ним и, наверное, воспользуюсь. Единственный недостаток, который я заметил, - это то, что я не могу самостоятельно создать идентификатор объекта для перекрестных ссылок.
@Barak Schiller
Спасибо, что разместили ссылку на XStream!
если вам нужно структурированное решение (например, 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;
}