博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java socket报文通信(三)java对象和xml格式文件的相互转换
阅读量:4597 次
发布时间:2019-06-09

本文共 7823 字,大约阅读时间需要 26 分钟。

前两节讲了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 converyToJavaBean(String xml, Class
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 = "
00011
李四
26
"; 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
books; public String getName() { return name; } public String getAge() { return age; } public List
getBooks() { return books; } public void setName(String name) { this.name = name; } public void setAge(String age) { this.age = age; } public void setBooks(List
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
books = new ArrayList
(); 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 = "
张三
26
" +"
How to use JAXB
作者1
" +"
How to use SOCKET
作者2
"; ListSocket listSocket = JaxbUtil.converyToJavaBean(xml, ListSocket.class); System.out.println(listSocket); }

 

 运行主函数,我们可以看见转换后的xml对象和类对象。使用就是这么的简单^_^!!!

 

转载于:https://www.cnblogs.com/mouseIT/p/4190054.html

你可能感兴趣的文章
赋值文件
查看>>
Vue 数组 字典 template v-for 的使用
查看>>
蓝牙模块选择经验谈
查看>>
java中==和equals
查看>>
CCActionPageTurn3D
查看>>
python random
查看>>
esp32-智能语音-cli(调试交互命令)
查看>>
netty与MQ使用心得
查看>>
关于dl dt dd 文字过长换行在移动端显示对齐的探讨总结
查看>>
swoolefy PHP的异步、并行、高性能网络通信引擎内置了Http/WebSocket服务器端/客户端...
查看>>
Python学习笔记
查看>>
unshift()与shift()
查看>>
使用 NPOI 、aspose实现execl模板公式计算
查看>>
行为型模式:中介者模式
查看>>
How to Notify Command to evaluate in mvvmlight
查看>>
33. Search in Rotated Sorted Array
查看>>
461. Hamming Distance
查看>>
Python垃圾回收机制详解
查看>>
{面试题1: 赋值运算符函数}
查看>>
Node中没搞明白require和import,你会被坑的很惨
查看>>