Ответ 1
"Официальный" Java API для этого теперь JAXB - Java API для привязки XML. См. Учебник от Oracle. Эталонная реализация находится в http://jaxb.java.net/
Что такое Java-аналог сериализации .NET XML?
"Официальный" Java API для этого теперь JAXB - Java API для привязки XML. См. Учебник от Oracle. Эталонная реализация находится в http://jaxb.java.net/
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>
XMLBeans отлично работает, если у вас есть схема для вашего XML. Он создает объекты Java для схемы и создает простые в использовании методы анализа.
Если вы говорите об автоматической сериализации объектов XML, посмотрите Castor:
Castor - это структура привязки данных с открытым исходным кодом для Java [tm]. Это кратчайший путь между объектами Java, XML-документами и реляционными таблицами. Castor обеспечивает привязку Java-to-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;
}