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或物件。