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或对象。