標籤:
前兩節講了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格式檔案的相互轉換