在UDP通信协议中,服务器和客户端之间通过用DatagramPacket构建数据包进行通信,在发送数据包之前,需要对封装好的消息对象进行序列化,使其成为Byte类型,而在Java中,只有实现了Serializable接口的类才能实现序列化,但是在学习过程中遇到一个问题,就是当实现了Serializable接口的类中有List<T>属性时,那么在对这个类进行序列化时,List<T>
不会被序列化,网上说,List本身就是一个接口,没有实现Serializable这一说,所以不能被序列化,于是用Gson类处理
1、Json串与List<Bean>转换
先将List<bean>解析成Json串,然后对Json串进行序列化,具体代码如下:
List<Member> list=new ArrayList<>(); //定义List
Member m1=new Member("zhangsan",1001);
Member m2=new Member("lisi",1002);
list.add(m1);
list.add(m2);
Gson gson=new Gson();
String jsonString=gson.toJson(list); //转化成json串
Message backMsg=new Message();//Message实现了Serializable接口
backMsg.setType("M_RANKED");
backMsg.setJsonString(jsonString);
byte[] buf=Translate.ObjectToByte(backMsg);//序列化
接受的时候先将Message反序列化,然后在获取Json串,并赋给List<Bean>,具体代码如下:
byte[] buf=new byte[8096];
//构建接受数据包
DatagramPacket backPacket=new DatagramPacket(buf,buf.length);//构建登录数据包
//接受数据包
clientSocket.receive(backPacket);
Message backMsg=(Message)Translate.ByteToObject(buf); //反序列化
Gson gson=new Gson();
//解析Json串并赋给List<Bean>
List<Member> list=gson.fromJson(backMsg.getJsonString(), new TypeToken<List<Member>>(){}.getType());
Bean-->Json
Member bean=new Member();
bean.setUserName("lisi");
bean.setScore(100);
bean.setLevel("学神-");
Gson gson=new Gson();
String jsonString=gson.toJson(bean); //将Bean转化为Json串
Gson gson=new Gson();
Member bean=gson.fromJson(msg.getJsonString(),Member.class);//将json串转化为bean
另贴上序列化类Translate
public class Translate {
//对象反序列化
public static Object ByteToObject(byte[] bytes) {
Object obj=null;
try {
ByteArrayInputStream bi=new ByteArrayInputStream(bytes); //字节数组输入流
ObjectInputStream oi=new ObjectInputStream(bi); //对象输入流
obj=oi.readObject(); //转为对象
}catch(Exception ex) { }
return obj;
}
//对象序列化
public static byte[] ObjectToByte(Object obj) {
byte[] bytes=null;
try {
ByteArrayOutputStream bo=new ByteArrayOutputStream(); //字节数组输出流
ObjectOutputStream oo=new ObjectOutputStream(bo); //对象输出流
oo.writeObject(obj); //输出对象
bytes=bo.toByteArray(); //对象序列化
}catch(IOException ex) {}
return bytes;
}
}