java socket報文通訊(三)java對象和xml格式檔案的相互轉換

來源:互聯網
上載者:User

標籤:

前兩節講了socket服務端,用戶端的建立以及報文的封裝。今天就來講一下java對象和xml格式檔案的相互轉換。

上一節中我們列舉了一個報文格式,其實我們可以理解為其實就是一個字串。但是我們不可能每次都去寫字串啊,這樣的話肯定要瘋。既然是物件導向的編程,肯定會有好的辦法來解決這個問題。我們使用JAXBContext這個工具。

package cn.com.egj.entity.shortcutTransfer.test;import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.StringReader;import java.net.URLEncoder;import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBException;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.stream.XMLOutputFactory;import javax.xml.stream.XMLStreamWriter;/** * Jaxb2工具類 */@XmlRootElementpublic class JaxbUtil {    /**     * JavaBean轉換成xml     *      * @param obj     * @param encoding     * @return     */    public static String convertToXml(Object obj) {        try {            JAXBContext context = JAXBContext.newInstance(obj.getClass());            Marshaller marshaller = context.createMarshaller();            marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);            ByteArrayOutputStream baos = new ByteArrayOutputStream();            //注意jdk版本            XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();            XMLStreamWriter xmlStreamWriter = xmlOutputFactory                    .createXMLStreamWriter(baos, (String) marshaller                            .getProperty(Marshaller.JAXB_ENCODING));            xmlStreamWriter.writeStartDocument(                    (String) marshaller.getProperty(Marshaller.JAXB_ENCODING),                    "1.0");            marshaller.marshal(obj, xmlStreamWriter);            xmlStreamWriter.writeEndDocument();            xmlStreamWriter.close();            return new String(baos.toString("GBK"));                    } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return null;    }    /**     * xml轉換成JavaBean     *      * @param xml     * @param c     * @return     */    @SuppressWarnings("unchecked")    public static <T> T converyToJavaBean(String xml, Class<T> c) {        T t = null;        try {            JAXBContext context = JAXBContext.newInstance(c);            Unmarshaller unmarshaller = context.createUnmarshaller();            t = (T) unmarshaller.unmarshal(new StringReader(xml));        } catch (Exception e) {            e.printStackTrace();        }        return t;    }}

以上兩個方法可以將java對象可xml檔案相互轉換。

接下來我們看看怎麼使用。

1)首先我們要建立需要轉換的類:

import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlType;@XmlAccessorType(XmlAccessType.FIELD)//表示使用這個類中的 private 非靜態欄位作為 XML 的序列化的屬性或者元素,對應屬性要使用get、set方法。@XmlRootElement(name="ROOT")@XmlType(propOrder={"code","name","age"})//xml格式資料的顯示的順序名字要和定義變數的一樣,而不是@XmlElement中的namepublic class MySocket {    @XmlElement(name="Code",required=true)//定義xml中顯示的資料    private  String code;    @XmlElement(name="Name",required=true)    private String name;    @XmlElement(name="Age",required=true)    private String age;    public String getCode() {        return code;    }    public String getName() {        return name;    }    public String getAge() {        return age;    }    public void setCode(String code) {        this.code = code;    }    public void setName(String name) {        this.name = name;    }    public void setAge(String age) {        this.age = age;    }        public String toString(){        return this.name+","+this.age+","+this.code;    }}

2)建立測試類別:

public class Test {    public static void main(String[] args) {        objectToXml();    }        public static  void objectToXml(){        MySocket mySocket = new MySocket();        mySocket.setName("張三");        mySocket.setCode("00012");        mySocket.setAge("25");        String xml = JaxbUtil.convertToXml(mySocket);        System.out.println(xml);    }    }

運行測試類別,我們將看到控制台輸出:<?xml version="1.0" encoding="GBK"?><ROOT><Code>00012</Code><Age>25</Age></ROOT>

對於Object轉xml,我們建立測試方法:

 

public static void xmlToObjetct(){        String xml = "<?xml version=\"1.0\" encoding=\"GBK\"?><ROOT><Code>00011</Code><Name>李四</Name><Age>26</Age></ROOT>";        MySocket mySocket= JaxbUtil.converyToJavaBean(xml, MySocket.class);        System.out.println(mySocket.toString());    }

 

 運行測試類別,我們將看到控制台輸出:李四,26,00011

3)有時候我們的java對象中會存在集合,這時我們像如下這麼做:

  3.1)首先我們建立袋集合的對象:

 

@XmlAccessorType(XmlAccessType.FIELD)@XmlRootElement(name="ROOT")@XmlType(propOrder={"name","age","books"})public class ListSocket {    @XmlElement(name="Name",required=true)    private String name;    @XmlElement(name="Age",required=true)    private String age;    @XmlElementWrapper(name="ROWS")//@XmlElementWrapper註解表示產生一個封裝 XML 表示形式的封裝器元素。 此元素主要用於產生一個封裝集合的封裝器 XML 元素    @XmlElement(name="LIST",required=true)    private List<Book> books;    public String getName() {        return name;    }    public String getAge() {        return age;    }    public List<Book> getBooks() {        return books;    }    public void setName(String name) {        this.name = name;    }    public void setAge(String age) {        this.age = age;    }    public void setBooks(List<Book> books) {        this.books = books;    }        public String toString(){        String result = "";        result=this.age+","+this.name+",集合的資料:";        for (Book book:books) {            result+=book.getAuthor()+book.getTime()+book.getBookName();        }        return result;    }}

 

@XmlAccessorType(XmlAccessType.FIELD)@XmlType(propOrder={"bookName","time","author"})public class Book {    @XmlElement(name="BookName")    private String bookName;    @XmlElement(name="Time")    private String time;    @XmlElement(name="Author")    private String author;    public String getBookName() {        return bookName;    }    public String getTime() {        return time;    }    public String getAuthor() {        return author;    }    public void setBookName(String bookName) {        this.bookName = bookName;    }    public void setTime(String time) {        this.time = time;    }    public void setAuthor(String author) {        this.author = author;    }}

 

 3.2)建立測試類別:

 

public class ListSocketTest {    public static void main(String[] args) {        objectToXml();        xmlToObject();    }        public static void objectToXml(){        ListSocket listSocket = new ListSocket();        listSocket.setName("張三");        listSocket.setAge("26");        List<Book> books = new ArrayList<Book>();        Book book1 = new Book();        book1.setAuthor("作者1");        book1.setTime("2014-12-28");        book1.setBookName("How to use JAXB");        Book book2= new Book();        book2.setAuthor("作者2");        book2.setTime("2014-06-06");        book2.setBookName("How to use SOCKET");        books.add(book1);        books.add(book2);        listSocket.setBooks(books);        String xml = JaxbUtil.convertToXml(listSocket);        System.out.println(xml);    }        public static void xmlToObject(){        String xml = "<?xml version=\"1.0\" encoding=\"GBK\"?><ROOT><Name>張三</Name><Age>26</Age><ROWS><LIST>"
+"<BookName>How to use JAXB</BookName><Time>2014-12-28</Time><Author>作者1</Author>"
+"</LIST><LIST><BookName>How to use SOCKET</BookName><Time>2014-06-06</Time><Author>作者2</Author></LIST></ROWS></ROOT>"; ListSocket listSocket = JaxbUtil.converyToJavaBean(xml, ListSocket.class); System.out.println(listSocket); }

 

 運行主函數,我們可以看見轉換後的xml對象和類對象。使用就是這麼的簡單^_^!!!

java socket報文通訊(三)java對象和xml格式檔案的相互轉換

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.