Json串与List<Bean>、Bean之间的转换,处理类中List<Bean>属性的序列化问题

在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());


2、Json串与Bean的转换
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串


Json-->Bean

 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;
    }
}

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值