Що таке 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).
Ми використовували його в одному з наших проектів для заміни старого ява-серіалізації, і він працював майже нестандартно.
Ви можете подивитися проект простої серіалізації XML . Це найближче, що я знайшов до 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-XML, стійкість Java-SQL та багато іншого.
Зазвичай я використовую jaxb або XMLBeans, якщо мені потрібно створити об'єкти, серіалізувані до XML. Тепер я можу бачити, що XStream може бути дуже корисним, оскільки неінструзивний та має дуже прості програми. Я незабаром зіграю з ним і, мабуть, ним скористаюся. Єдиний недолік, який я помітив, це те, що я не можу створити ідентифікатор об’єкта самостійно для перехресних посилань.
@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;
}