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对象和类对象。使用就是这么的简单^_^!!!
java socket报文通信(三)java对象和xml格式文件的相互转换的更多相关文章
- java socket报文通信(一)socket的建立
java socket报文通信(一) socket的建立 今天来和大家分享一下java中如何使用socket进行通信.先来啰嗦两句,看看Tcp/ip和udp: TCP是Transfer Contro ...
- java socket报文通信(二)报文的封装
昨天我们谈了怎么建立socket通信的服务端和客户端,今天我们就来谈一谈怎么封装报文. 什么是报文这里我就不在阐述了,不清楚的朋友可以自己去查资料.我们今天要谈的报文主要友以下几个部分组成: 3位同步 ...
- java socket报文通信(一) socket的建立
TCP是Transfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流.发送方和接收方的成对的两个socket之间 ...
- Java发HTTP POST请求(内容为xml格式)
Java发HTTP POST请求(内容为xml格式) 一.POST请求 服务器地址:http://5.0.217.50:17001/VideoSend 服务器提供的是xml格式的http接口,接口定义 ...
- 字符串对象跟xml格式的转换
package com.sunshen.jfids.testWebService.task; import java.io.File; import java.io.StringWriter; imp ...
- .NET调用外部接口将得到的List数据,并使用XmlSerializer序列化List对象成XML格式
BidOpeningData.BidSupervisionSoapClient client = new BidOpeningData.BidSupervisionSoapClient(); Dict ...
- Java Socket应用---通信是这样练成的
网络基础简介 Java 中网络相关 API 的应用 Java 中的 InetAddress 的应用 Test01.java package com.imooc; import java.n ...
- java socket之传输实体类对象
一.TCP编程 TCP协议是面向连接的.可靠地.有序的,以字节流的方式发送数据.java实现TCP通信依靠2个类:客户端的Socket类和服务器端的ServerSocket类. 基于TCP通信 ...
- Java Socket实战之三:传输对象
转自:https://i.cnblogs.com/EditPosts.aspx?opt=1 前面两篇文章介绍了怎样建立Java Socket通信,这一篇说一下怎样使用Java Socket来传输对象. ...
随机推荐
- How to create Managed Metadata Column
This article introduce how to create/use managed metadata column from List. First, we need to config ...
- An unspecified error occurred!
在我们生成证书的时候,有时候会遇到这个问题,明明刚从电脑的钥匙串申请的证书,却报错!遇到这个不用急.多试几次.不是你的生成的证书不管用,多半原因是因为你的网速太挫了!
- 运行Capture.exe找不到cdn_sfl401as.dll
今天运行capture Orcad16.6显示缺少cdn_sfl401as.dll,昨天运行时并没有发现这种情况,回想今天安装了modelsim之后才发生这种情况,于是将modelsim卸载掉,再次启 ...
- 去除win8.1这台电脑中的6个库文件夹
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace,备份之后删除 wi ...
- 转:使用Android API最佳实践
原文来自于:http://blog.jobbole.com/65170/ 写在前面 现在,Android应用程序中集成第三方API已十分流行.应用程序都有自己的网络操作和缓存处理机制,但是大部分比较脆 ...
- 云方案,依托H3C彩虹云存储架构,结合UIA统一认证系统,实现了用户数据的集中存储和管理
客户的声音 资料云项目在迷你云基础上二次开发,通过使用云存储技术及文件秒传技术,对文件进行统一存储与管理,以达到节约文件管理成本.存储成本目的:通过有效的文件版本控制机制,以达到风险管控的目的:通过多 ...
- 文档整体解决方案(readthedocs、github 、sphinx)使用
这里是总结了一下,用的工具或者平台:readthedocs.github .sphinx. 使用这三个工具即可轻松创建高效的文档管理库,可以用来翻译,水平再高一点可以写书. readthedocs 文 ...
- latch:library cache
一:硬解析造成的shared pool latch 争用: 每一个sql被执行之前,先要到library cache中根据hash_value查找parent cursor,这就需要先获得librar ...
- UVA11388 GCD LCM(数论)
题目链接. 题意: 给定两个数,一个G,一个L,找出两个数a,b(a<=b),使得这两个数的最大公约数为G,最小公倍数为L,且(a最小). 分析: 当a,b存在时,a一定为G. 自己证了一下,数 ...
- 【贪心+堆】XMU 1584 小明的烦恼
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1584 题目大意: 给n(n<=100 000)个任务的耗时和截至时间,问最少不能 ...