Json串與List、Bean之間的轉換,處理類中List屬性的序列化問題

KeepTing發表於2016-12-26

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


















相關文章