java socket报文通信(三)java对象和xml格式文件的相互转换

前两节讲了socket服务端,客户端的建立以及报文的封装。今天就来讲一下java对象和xml格式文件的相互转换。

上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串。但是我们不可能每次都去写字符串啊,这样的话肯定要疯。既然是面向对象的编程,肯定会有好的办法来解决这个问题。我们使用JAXBContext这个工具。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package cn.com.egj.entity.shortcutTransfer.test;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.ByteArrayInputStream;  
  5. import java.io.ByteArrayOutputStream;  
  6. import java.io.InputStream;  
  7. import java.io.InputStreamReader;  
  8. import java.io.StringReader;  
  9. import java.net.URLEncoder;  
  10.   
  11. import javax.xml.bind.JAXBContext;  
  12. import javax.xml.bind.JAXBException;  
  13. import javax.xml.bind.Marshaller;  
  14. import javax.xml.bind.Unmarshaller;  
  15. import javax.xml.bind.annotation.XmlRootElement;  
  16. import javax.xml.stream.XMLOutputFactory;  
  17. import javax.xml.stream.XMLStreamWriter;  
  18.   
  19. /** 
  20.  * Jaxb2工具类 
  21.  */  
  22. @XmlRootElement  
  23. public class JaxbUtil {  
  24.   
  25.     /** 
  26.      * JavaBean转换成xml 
  27.      *  
  28.      * @param obj 
  29.      * @param encoding 
  30.      * @return 
  31.      */  
  32.     public static String convertToXml(Object obj) {  
  33.   
  34.         try {  
  35.             JAXBContext context = JAXBContext.newInstance(obj.getClass());  
  36.             Marshaller marshaller = context.createMarshaller();  
  37.   
  38.             marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");  
  39.             marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);  
  40.   
  41.             ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  42.             //注意jdk版本  
  43.             XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();  
  44.             XMLStreamWriter xmlStreamWriter = xmlOutputFactory  
  45.                     .createXMLStreamWriter(baos, (String) marshaller  
  46.                             .getProperty(Marshaller.JAXB_ENCODING));  
  47.             xmlStreamWriter.writeStartDocument(  
  48.                     (String) marshaller.getProperty(Marshaller.JAXB_ENCODING),  
  49.                     "1.0");  
  50.             marshaller.marshal(obj, xmlStreamWriter);  
  51.             xmlStreamWriter.writeEndDocument();  
  52.             xmlStreamWriter.close();  
  53.             return new String(baos.toString("GBK"));  
  54.               
  55.         } catch (Exception e) {  
  56.             // TODO Auto-generated catch block  
  57.             e.printStackTrace();  
  58.         }  
  59.         return null;  
  60.   
  61.     }  
  62.   
  63.     /** 
  64.      * xml转换成JavaBean 
  65.      *  
  66.      * @param xml 
  67.      * @param c 
  68.      * @return 
  69.      */  
  70.     @SuppressWarnings("unchecked")  
  71.     public static <T> T converyToJavaBean(String xml, Class<T> c) {  
  72.         T t = null;  
  73.         try {  
  74.             JAXBContext context = JAXBContext.newInstance(c);  
  75.             Unmarshaller unmarshaller = context.createUnmarshaller();  
  76.             t = (T) unmarshaller.unmarshal(new StringReader(xml));  
  77.         } catch (Exception e) {  
  78.             e.printStackTrace();  
  79.         }  
  80.   
  81.         return t;  
  82.     }  
  83.   
  84. }  

以上两个方法可以将java对象可xml文件相互转换。

接下来我们看看怎么使用。

1)首先我们要建立需要转换的类:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. import javax.xml.bind.annotation.XmlAccessType;  
  2. import javax.xml.bind.annotation.XmlAccessorType;  
  3. import javax.xml.bind.annotation.XmlElement;  
  4. import javax.xml.bind.annotation.XmlRootElement;  
  5. import javax.xml.bind.annotation.XmlType;  
  6.   
  7. @XmlAccessorType(XmlAccessType.FIELD)//表示使用这个类中的 private 非静态字段作为 XML 的序列化的属性或者元素,对应属性要使用get、set方法。  
  8. @XmlRootElement(name="ROOT")  
  9. @XmlType(propOrder={"code","name","age"})//xml格式数据的显示的顺序名字要和定义变量的一样,而不是@XmlElement中的name  
  10. public class MySocket {  
  11.     @XmlElement(name="Code",required=true)//定义xml中显示的数据  
  12.     private  String code;  
  13.     @XmlElement(name="Name",required=true)  
  14.     private String name;  
  15.     @XmlElement(name="Age",required=true)  
  16.     private String age;  
  17.     public String getCode() {  
  18.         return code;  
  19.     }  
  20.     public String getName() {  
  21.         return name;  
  22.     }  
  23.     public String getAge() {  
  24.         return age;  
  25.     }  
  26.     public void setCode(String code) {  
  27.         this.code = code;  
  28.     }  
  29.     public void setName(String name) {  
  30.         this.name = name;  
  31.     }  
  32.     public void setAge(String age) {  
  33.         this.age = age;  
  34.     }  
  35.       
  36.     public String toString(){  
  37.         return this.name+","+this.age+","+this.code;  
  38.     }  
  39. }  

2)建立测试类:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         objectToXml();  
  4.     }      
  5.     public static  void objectToXml(){  
  6.         MySocket mySocket = new MySocket();  
  7.         mySocket.setName("张三");  
  8.         mySocket.setCode("00012");  
  9.         mySocket.setAge("25");  
  10.         String xml = JaxbUtil.convertToXml(mySocket);  
  11.         System.out.println(xml);  
  12.     }      
  13. }  

运行测试类,我们将看到控制台输出:<?xml version="1.0" encoding="GBK"?><ROOT><Code>00012</Code><Age>25</Age></ROOT>

对于Object转xml,我们建立测试方法:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public static void xmlToObjetct(){  
  2.         String xml = "<?xml version=\"1.0\" encoding=\"GBK\"?><ROOT><Code>00011</Code><Name>李四</Name><Age>26</Age></ROOT>";  
  3.         MySocket mySocket= JaxbUtil.converyToJavaBean(xml, MySocket.class);  
  4.         System.out.println(mySocket.toString());  
  5.     }  

运行测试类,我们将看到控制台输出:李四,26,00011

3)有时候我们的java对象中会存在集合,这时我们像如下这么做:

  3.1)首先我们建立袋集合的对象:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @XmlAccessorType(XmlAccessType.FIELD)  
  2. @XmlRootElement(name="ROOT")  
  3. @XmlType(propOrder={"name","age","books"})  
  4. public class ListSocket {  
  5.   
  6.     @XmlElement(name="Name",required=true)  
  7.     private String name;  
  8.     @XmlElement(name="Age",required=true)  
  9.     private String age;  
  10.     @XmlElementWrapper(name="ROWS")//@XmlElementWrapper注解表示生成一个包装 XML 表示形式的包装器元素。 此元素主要用于生成一个包装集合的包装器 XML 元素  
  11.     @XmlElement(name="LIST",required=true)  
  12.     private List<Book> books;  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     public String getAge() {  
  17.         return age;  
  18.     }  
  19.     public List<Book> getBooks() {  
  20.         return books;  
  21.     }  
  22.     public void setName(String name) {  
  23.         this.name = name;  
  24.     }  
  25.     public void setAge(String age) {  
  26.         this.age = age;  
  27.     }  
  28.     public void setBooks(List<Book> books) {  
  29.         this.books = books;  
  30.     }  
  31.       
  32.     public String toString(){  
  33.         String result = "";  
  34.         result=this.age+","+this.name+",集合的数据:";  
  35.         for (Book book:books) {  
  36.             result+=book.getAuthor()+book.getTime()+book.getBookName();  
  37.         }  
  38.         return result;  
  39.     }  
  40. }  


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @XmlAccessorType(XmlAccessType.FIELD)  
  2. @XmlType(propOrder={"bookName","time","author"})  
  3. public class Book {  
  4.     @XmlElement(name="BookName")  
  5.     private String bookName;  
  6.     @XmlElement(name="Time")  
  7.     private String time;  
  8.     @XmlElement(name="Author")  
  9.     private String author;  
  10.     public String getBookName() {  
  11.         return bookName;  
  12.     }  
  13.     public String getTime() {  
  14.         return time;  
  15.     }  
  16.     public String getAuthor() {  
  17.         return author;  
  18.     }  
  19.     public void setBookName(String bookName) {  
  20.         this.bookName = bookName;  
  21.     }  
  22.     public void setTime(String time) {  
  23.         this.time = time;  
  24.     }  
  25.     public void setAuthor(String author) {  
  26.         this.author = author;  
  27.     }  
  28. }  
 3.2)建立测试类:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class ListSocketTest {  
  2.     public static void main(String[] args) {  
  3.         objectToXml();  
  4.         xmlToObject();  
  5.     }  
  6.       
  7.     public static void objectToXml(){  
  8.         ListSocket listSocket = new ListSocket();  
  9.         listSocket.setName("张三");  
  10.         listSocket.setAge("26");  
  11.         List<Book> books = new ArrayList<Book>();  
  12.         Book book1 = new Book();  
  13.         book1.setAuthor("作者1");  
  14.         book1.setTime("2014-12-28");  
  15.         book1.setBookName("How to use JAXB");  
  16.         Book book2= new Book();  
  17.         book2.setAuthor("作者2");  
  18.         book2.setTime("2014-06-06");  
  19.         book2.setBookName("How to use SOCKET");  
  20.         books.add(book1);  
  21.         books.add(book2);  
  22.         listSocket.setBooks(books);  
  23.         String xml = JaxbUtil.convertToXml(listSocket);  
  24.         System.out.println(xml);  
  25.     }  
  26.       
  27.     public static void xmlToObject(){  
  28.         String xml = "<?xml version=\"1.0\" encoding=\"GBK\"?><ROOT><Name>张三</Name><Age>26</Age><ROWS><LIST>"  
  29.                        +"<BookName>How to use JAXB</BookName><Time>2014-12-28</Time><Author>作者1</Author>"  
  30.                        +"</LIST><LIST><BookName>How to use SOCKET</BookName><Time>2014-06-06</Time><Author>作者2</Author></LIST></ROWS></ROOT>";  
  31.         ListSocket listSocket = JaxbUtil.converyToJavaBean(xml, ListSocket.class);  
  32.         System.out.println(listSocket);  
  33.     }  

转自:http://www.cnblogs.com/mouseIT/p/4190054.html
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值