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来传输对象. ...
随机推荐
- [转]为什么移动Web 应用程序很慢
原文出处: Herb Sutter 译文出处: tangzhnju 我写过不少文章来讨论为什么移动Web应用程序很慢,这也引起了不少的讨论.但是不幸的是,这些讨论没有像我喜欢的那样的基于事实. 所 ...
- Python HiveServer2
1. 安装pyhs2 pyhs2依赖项如下: gcc-c++ python-devel.x86_64 cyrus-sasl-devel.x86_64 因此pyhs2的安装命令如下: ...
- LeetCode——Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters. For example, ...
- Scala 编程(三)基本类型和操作
一些基本类型 值类型 范围 Byte 8位有符号补码整数(-27-27-1) Short 16位有符号补码整数(-215-215-1) Int 32位有符号补码整数(-231-231-1) Long ...
- [工作] 使在家办公(Work From Home)更有效率的建议
在家办公(Work From Home) 是一种灵活的工作方式,节省了漫长的上下班挤公交的时间,有更多可支配的时间. 我司允许员工申请在家办公,每周一天的配额.本人长期在办公室工作,习惯了办公室里工作 ...
- Hackerrank 2020 February 2014 解题报告
Hackerrank 2020 February 2014 解题报告 比赛链接 Sherlock and Watson (20分) 题意:给定一个数组,向右平移K次,然后有Q个询问,问第x位置上是几 ...
- 在sql语句中使用plsql变量
示例代码如下: create or replace type ua_id_table is table of number; declare v_tab ua_id_table;begin v_tab ...
- 自然语言.例如:求n!。
(1).定义3个变量i.n及mul,并为i和mul均赋初值为1. (2).从键盘中输入一个数赋给n. (3).将mul乘以i的结果赋给mul. (4)i的值加1,判断i的值是否大于n.如果大于n,则执 ...
- android的intent打开系统程序
打开设置主界面 Intent intent = new Intent(Android.provider.Settings.ACTION_SETTINGS); //系统设置 startActivityF ...
- python_Opencv_使用Matplotlib模块
使用Matplotlib模块 Matplotib 是python 的一个绘图库,里头有各种各样的绘图方法. 之后会陆续了解.先学习怎样用Matplotib 显示图像. 可以放大图像,保存图像. 安装M ...