XML-серіалізація на Java? [зачинено]


104

Що таке Java-аналог серіалізації XML у форматі .NET?


6
Ах, славні старі часи, коли запитання на одній лайнері, подібні до цього, були привітаннями на SO. Так корисно. Без усього цього "Що ви пробували?" / "Надайте деталі" дурниці люди люблять читати сьогодні.
GOTO 0

Відповіді:


81

Відповідь 2008 року "Офіційним" Java API для цього зараз є JAXB - Java API для прив'язки XML. Дивіться Підручник від Oracle . Реалізація посилань діє на веб-сайті http://jaxb.java.net/

Оновлення 2018 року Зауважте, що модулі Java EE і CORBA застаріли в SE в JDK9 і повинні бути вилучені з SE в JDK11 . Отже, для використання JAXB потрібно буде або у вашому існуючому середовищі корпоративного класу, що постачається, наприклад, сервером додатків, або вам потрібно буде ввести його вручну.


2
Правильно, JAXB, безумовно, найкращий варіант!
ivan_ivanovich_ivanoff

1
JAXB було видалено зі стандартних java-дистрибутивів, як у Java 10, що робить його тепер бібліотекою, яку ви повинні поєднати зі своїм додатком, якщо ви цього хочете, якщо ви не працюєте в контексті, який вже поєднує його для вас.
Теодор Мердок

69

XStream досить добре серіалізує об'єкт до XML без особливої ​​конфігурації та грошей! (це під ліцензією BSD).

Ми використовували його в одному з наших проектів для заміни старого ява-серіалізації, і він працював майже нестандартно.


3
Дуже корисно, але це може мати проблеми із складеними структурами дерева, такими як JGraph, але з об'єктами без рядкових вузлів.
mikek3332002

Простіші та кращі за інші рішення
daitangio

Мені подобається XStream. Єдине, що я не розумію, чому символ додається перед фактичним XML.
Джеймс П.

17

Проект "Проста серіалізація XML"

Ви можете подивитися проект простої серіалізації XML . Це найближче, що я знайшов до System.Xml.Serialization в .Net.


Однак воно вимагає відображення анотацій для кожного поля.
мП.

1
Неправда, я не вимагаю. Ви можете змінити поведінку за замовчуванням, і вона використовуватиме лише наявні поля.
damluar

1
Я від душі схвалюю і "Просте" . Я користувався ним у кількох проектах з великим успіхом. "Простий" насправді набагато простіше, ніж JAXB. Найбільш доцільно, коли у вас є відносно прості потреби: Отримати об’єкти, які потрібно записати в сховище, щоб згодом знову бути гідратованими як об’єкти. JAXB має набагато більше можливостей та гнучкості, але це "80/20" речі, більшість часу в більшості проектів вам може знадобитися лише простий підмножина функцій.
Василь Бурк

Добре працює, якщо ви просто хочете зіставити 1: 1. Якщо ваші класи розвиваються, і вам все одно потрібно дезаріалізувати старий XML, у вас виникають проблеми, оскільки і документація, і повідомлення про помилки дещо розпливчасті. Діагностувати проблему, як правило, можливо, але розібратися, як її виправити, може зайняти кілька днів.
toolforger

13

JAXB є частиною стандартної версії JDK версії 1.6+. Так що FREEзавантажувати та керувати ними не потрібно. Простий приклад можна знайти тут

XStream, здається, мертвий. Останнє оновлення було 6 грудня 2008 р. SimpleЗдається таким же простим та простим, як JAXB, але я не зміг знайти жодної інформації про ліцензування, щоб оцінити її для використання підприємством.


4
XStream не мертвий, він просто зрілий і стабільний - це означає, що не так багато, щоб додати до основних функціональних можливостей. Те ж саме стосується впровадження еталонної JAXB, за останні кілька років не велика активність.
StaxMan

9

Варто згадати, що з версії 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>

Майте на увазі, що використання java.beans.XMLDecoderданих, що надаються користувачем, може ввести в ваш код довільні уразливості виконання коду.
авентурин

2

XMLBeans чудово працює, якщо у вас є схема для вашого XML. Він створює об’єкти Java для схеми та створює прості у використанні методи розбору.


0

Якщо ви говорите про автоматичну серіалізацію XML-об'єктів, перегляньте Castor :

Castor - це рамка зв’язування даних з відкритим кодом для Java [tm]. Це найкоротший шлях між об'єктами Java, XML-документами та реляційними таблицями. Castor забезпечує прив'язку Java-XML, стійкість Java-SQL та багато іншого.


0

Зазвичай я використовую jaxb або XMLBeans, якщо мені потрібно створити об'єкти, серіалізувані до XML. Тепер я можу бачити, що XStream може бути дуже корисним, оскільки неінструзивний та має дуже прості програми. Я незабаром зіграю з ним і, мабуть, ним скористаюся. Єдиний недолік, який я помітив, це те, що я не можу створити ідентифікатор об’єкта самостійно для перехресних посилань.

@Barak Schiller
Дякую за публікацію посилання на XStream!


Проблема полягає в тому, що jaxb і xmlbeans вимагають схему зіставлення карт та arent auto ...
mP.



-1
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;
}

Багато проблем: Reinvention Class # getSimpleName *** Reinvention of PropertyDescriptor *** Передбачає, що всі властивості доступні поля *** Не кешують результати відображення (slooow) *** Немає способів нічого налаштувати (наприклад, мені потрібно буде замінити назви класів та файлів) *** Немає десеріалізації
toolforger
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.