Easy XML Serializer для Java - PullRequest
       1

Easy XML Serializer для Java

0 голосов
/ 17 июня 2010

Я ищу способ сериализации Java-объектов в XML для использования веб-сервисом RESTful. У меня нет XSD.

Я посмотрел на следующее:

  1. JAXB - достаточно большой вес с аннотациями, необходимыми для классов, а также класс ObjectFactory и / или файл jaxb.index

  2. Простой - требует аннотаций, но никаких других конфигурационных классов / файлов. К сожалению, он не может сериализовать наборы.

  3. XStream - аннотации и т. Д. Не требуются, но не поддерживаются дженерики

У кого-нибудь еще есть предложения?

Ответы [ 4 ]

4 голосов
/ 17 июня 2010

JAXB довольно безболезненный, поставляется с Java 6 и имеет малую площадь.

Вы получаете это по цене одной аннотации.

Order.java

package xxx;


import java.util.Date;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Order {

    int custId;
    Date orderDate;
    String description;
    List<Item> items;

    public void setCustId(int custId) {
        this.custId = custId;
    }

    public void setOrderDate(Date orderDate) {
        this.orderDate = orderDate;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setItems(List<Item> items) {
        this.items = items;
    }

    public int getCustId() {
        return custId;
    }

    public Date getOrderDate() {
        return orderDate;
    }

    public String getDescription() {
        return description;
    }

    public List<Item> getItems() {
        return items;
    }

    public String toString() {
        return "Order: " + custId + " - " + orderDate + " - " + description + " - " + items;
    }
}

Item.java:

package xxx;

public class Item {

    String name;
    private int qty;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getQty() {
        return qty;
    }

    public void setQty(int qty) {
        this.qty = qty;
    }

    public String toString() {
        return "Item:" + name + " - " + qty;
    }
}

Test.java:

package xxx;

import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Test {

    public static void main(String args[]) throws Exception {
    Order o = new Order();
        o.setCustId(123);
        o.setDescription("New order");
        o.setOrderDate(new Date());

        List<Item> items = new ArrayList<Item>();

        Item i = new Item();
        i.setName("Duck Soup");
        i.setQty(10);
        items.add(i);

        i = new Item();
        i.setName("Carrots");
        i.setQty(4);

        items.add(i);

        o.setItems(items);


        //Write it
        JAXBContext ctx = JAXBContext.newInstance(Order.class);

        Marshaller m = ctx.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        StringWriter sw = new StringWriter();
        m.marshal(o, sw);
        sw.close();
        System.out.println(sw.toString());

        // Read it back
        JAXBContext readCtx = JAXBContext.newInstance(Order.class);
        Unmarshaller um = readCtx.createUnmarshaller();

        Order newOrder = (Order) um.unmarshal(new StringReader(sw.toString()));
        System.out.println(newOrder);
    }
}

Результаты:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<order>
    <custId>123</custId>
    <description>New order</description>
    <items>
        <name>Duck Soup</name>
        <qty>10</qty>
    </items>
    <items>
        <name>Carrots</name>
        <qty>4</qty>
    </items>
    <orderDate>2010-06-16T18:12:06.870-07:00</orderDate>
</order>

Order: 123 - Wed Jun 16 18:12:06 PDT 2010 - New order - [Item:Duck Soup - 10, Item:Carrots - 4]
4 голосов
/ 17 июня 2010
import java.beans.XMLEncoder;
import java.beans.XMLDecoder;
import java.io.*;

public class XMLSerializer {
    public static void write(Object f, String filename) throws Exception{
        XMLEncoder encoder =
           new XMLEncoder(
              new BufferedOutputStream(
                new FileOutputStream(filename)));
        encoder.writeObject(f);
        encoder.close();
    }

    public static Object read(String filename) throws Exception {
        XMLDecoder decoder =
            new XMLDecoder(new BufferedInputStream(
                new FileInputStream(filename)));
        Object o = (Object)decoder.readObject();
        decoder.close();
        return o;
    }
}
1 голос
/ 17 июня 2010

Мой голос будет за XStream.Отсутствие поддержки дженериков - это небольшая цена за гибкость, которую она предлагает.Вы также можете легко реализовать обобщенные типы, сериализовав тип обобщенного класса во время сериализации, или встроить их в свои доменные объекты.Например,

   class Customer
   {
      List<Order> orders;

      public List<Order> getOrders()
      {
         return orders;
      }
   }

В потоке тип элемента обозначает тип каждого объекта.Когда тип является абстрактным типом или интерфейсом, элемент перечисляется с реализующим классом, если это не было указано как значение по умолчанию для этого типа интерфейса.(Например, ArrayList по умолчанию для экземпляров статического типа List.)

Дженерики - это «розовые очки» в java - они на самом деле не меняют то, что вы видите, просто то, как вы это видите.Объекты будут отправлены по проводам точно так же, если они были отправлены с поддержкой дженериков или нет.

0 голосов
/ 18 июня 2010

Вы можете попробовать JLibs XMLDocument .Он использует SAX для создания XML и, следовательно, легкий и полный контроль.

...