Вопрос

Что такое Java-аналог XML-сериализации .NET?

Это было полезно?

Другие советы

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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top