http請求/restful/序列化反序列化/JSON


1.為什么要實現Serializable

(1)將內存中的對象數據存在磁盤中持久化

(2)將對象從一個應用程序發送到另一個應用程序

實現Serializable接口可以把對象序列化為字節流,實現傳輸必須實現序列化。

使用時將字節流反序列化為對象,應用其創建的副本。


 

2.為什么網絡傳輸時對象要序列化,而字符串就不用序列化

網絡傳輸需要將對象轉換成字節流傳輸,序列化可以將一個對象轉化成一段字節編碼,以便在網絡上傳輸或者做存儲處理,使用時再進行反序列;

而字符串不用序列化的原因是字符串String是已經實現了Serializable接口的,所以它已經是序列化了的。


 

3.http請求中的JSON

網絡傳輸中使用字符串進行交互,JSON是一種特殊規范的字符串,有自己的格式規定,與String的顯示形式一樣,但本質不是String!各端都支持JSON串的格式,將JSON容易轉化為String進行網絡傳輸。

fastJson是java用來實現序列化與反序列化的工具:

(1)PSOT請求參數為params時,對應postman的調用形式是拼參數。

String response = RestHttpClient.httpPost(url, headerList, params);

其中參數params為Map。

(2)POST請求參數為Body時,參數為JSONString,即JSON樣子的String,postman調用時

如接口為

@RequestMapping(value = "toRefund", method = RequestMethod.POST)
public ServerResult<String> toRefund(@RequestBody final RefundRequestDto refundRequestDto)

程序調用時:

String response = RestHttpClient.httpPost(registerBasePath + refundSubmit, headers, JSON.toJSONString(refundRequestDto));

參數為JSONString,序列化為JSONString(即JSON形式的String,形式為JSON,本質為String)。fastJson中JSON.toJSONString(對象)將對象轉為JSONString,進行網絡傳輸。

得到的response也為String,JSONString。

轉化為JSONObject(真正的JSON,比String增強了按key取值的功能),用

JSONObject object = JSON.parseObject(response);

JSON.parseObject(String)---->JSONObject,可以get值

object.getString("data")

String data是返回對象中的一個成員。

若要從JSONString得到對象,若返回的對象為Person,將其轉化為JSONString的response回給調用方,調用方取得String的response后,還原為Person類

Person person = JSON.parseObject(response, Person.class);

還原時類Person中對應的成員參數名要對應一致。


 

4.上例中,Person對象序列化為JSONString時,成員變量要有對應的set,get方法,因為fastJson利用反射機制,調用get方法取值,set賦值。沒有set無法序列化,沒有get無法反序列化。

如Person類

class Person {
            int age =10;
            String name = "Kobe";

            public int getAge() {
                return age;
            }

            public void setAge(int age) {
                this.age = age;
            }

//            public String getName() {
//                return name;
//            }
//
//            public void setName(String name) {
//                this.name = name;
//            }
        }
Person person = new Person();
String string = JSON.toJSONString(person);
System.out.println("JSON.toJSONString(person) = " + string);


結果為:
JSON.toJSONString(person) = {"age":10}

name屬性無法序列化。

JSONObject jsonObject = JSON.parseObject(string);
System.out.println("JSON.parseObject(string) = " + jsonObject);

結果為:
JSON.parseObject(string) = {"age":10}

序列化確實,反序列化也無法取到值。

所謂序列化指對象------->JSONString,反序列化指JSONString------>JSONObject或對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM