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

前两节讲了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工具类
 */
@XmlRootElement
public 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中的name
public 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对象和类对象。使用就是这么的简单^_^!!!

时间: 2024-10-19 13:19:55

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

java socket报文通信(一)socket的建立

java socket报文通信(一) socket的建立  今天来和大家分享一下java中如何使用socket进行通信.先来啰嗦两句,看看Tcp/ip和udp: TCP是Transfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流.发送方和接收方的成对的两个socket之间必须建 立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socke

XML编程总结(六)——使用JAXB进行java对象和xml格式之间的相互转换

(六)使用JAXB进行java对象和xml格式之间的相互转换 JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标志可以转换为JSON对象的JAVA类. JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向生成Java对象树

java socket报文通信(二)报文的封装

昨天我们谈了怎么建立socket通信的服务端和客户端,今天我们就来谈一谈怎么封装报文. 什么是报文这里我就不在阐述了,不清楚的朋友可以自己去查资料.我们今天要谈的报文主要友以下几个部分组成: 3位同步校验位+8位报文长度+报文头+报文体+32位MD5校验位 基本格式如下: 0X110X120X1300000232<?xml version="1.0" encoding="GBK"?><ROOT><Code>0204</Cod

java中使用XStream实现将对象转为xml格式字符串或者将xml格式的字符串转换为对象==

我们经常会有需求,比如调用别人的接口,别人会返回给你json或者xml格式的数据,然后我们要转换为相应的对象供我们自己使用: 也有的时候是别人的调我们的接口,让我们提供xml格式的数据或者json格式的数据,json的话这里都不说了,很好处理,甚至springMvc本身就很容易支持. 下面只介绍xml和对象彼此转换 首先我们需要引入的jar包:xstream-1.4.8.jar 下面直接贴代码,代码是在springMvc环境下写的 @Controller public class Navigat

JAVA 虚拟机深入研究(三)——Java内存区域

JAVA 虚拟机深入研究(一)--关于Java的一些历史 JAVA 虚拟机深入研究(二)--JVM虚拟机发展以及一些Java的新东西 JAVA 虚拟机深入研究(三)--Java内存区域 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的围城,城外的人想进去,城里的人想出来. Java运行的时候会把内存分为若干个,他们各有各的用途,每块区域的创建和销毁都是相对独立的,有的跟虚拟机一起混,有的则抱着用户的大腿同生共死. 按照第七版的<Java虚拟机规范>规定,JVM所管理的内存包括以下

.NET调用外部接口将得到的List数据,并使用XmlSerializer序列化List对象成XML格式

BidOpeningData.BidSupervisionSoapClient client = new BidOpeningData.BidSupervisionSoapClient(); Dictionary<string, string> param = new Dictionary<string, string>(); param.Add(CommonParam.ConnKey, DBConnHelper.GetConnectionKey(DBConnHelper.Busi

java socket之传输实体类对象

一.TCP编程     TCP协议是面向连接的.可靠地.有序的,以字节流的方式发送数据.java实现TCP通信依靠2个类:客户端的Socket类和服务器端的ServerSocket类. 基于TCP通信的Socket模型如下: Socket通信的实现步骤如下: 1.    创建服务器端Socket:ServerSocket和客户端Socket:Socket: 2.    打开连接到Socket的InputStream/OutputStream; 3.    按照协议对Socket进行读写操作: 4

Java Socket应用(三)——java中URL的应用

转载请注明:http://blog.csdn.net/uniquewonderq 如何使用呢? package com.test; import java.net.MalformedURLException; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; public class test{ public static void main(String[] args) {

java socket线程通信

关于socket线程通信的一些知识整理 一般我们需要要让两台机子进行通信,需要创建一个Server 类,一个Client类,还需要创建一个线程类 server public class Server { public static void main(String[] args) throws IOException {  ServerSocket ss = new ServerSocket(8888);  int num=0;  System.out.println("服务器即将启动,   等