關於資料序列化 4 ,FastJson的兩個bug

2021-08-04 13:44:40 字數 2275 閱讀 2647

#bug1 fastjson迴圈引用引發乙個bug

fastjson可以將乙個物件序列化為json,也可以通過反序列化出乙個完整的物件。且支援迴圈引用。

/** ::new */

public class data******vo

public data******vo(string name, object value)

@override

public string tostring()

}

data******vo a = new data******vo("a", 1);

data******vo b = new data******vo("b", 2);

b.value = a;

mapmap = new hashmap<>();

map.put(a.name, a);

b.value1 = map;

string jsonstr = json.tojsonstring(b);

system.out.println(jsonstr);

data******vo obj = json.parseobject(jsonstr, data******vo.class);

system.out.println(obj.tostring());

執行結果

,"value1":}}

data******vo [name=b, value=, value1=}]

反序列化成功

改一下**

data******vo a = new data******vo("a", 1);

data******vo b = new data******vo("b", 2);

b.value1 = a;

mapmap = new hashmap<>();

map.put(a.name, a);

b.value = map;

string jsonstr = json.tojsonstring(b);

system.out.println(jsonstr);

data******vo obj = json.parseobject(jsonstr, data******vo.class);

system.out.println(obj.tostring());

執行結果

},"value1":}

data******vo [name=b, value=}, value1=null]

b中的value1為空,反序列化失敗

#bug2 要序列化的類含有class型別屬性引起的迴圈遞迴無法結束最後記憶體溢位

要序列化、反序列化的類

public class request implements serializable 

public void setclazz(class<?> clazz)

public string getmethod()

public void setmethod(string method)

public object getparam()

public void setparam(object param)

public object invoke(object bean) throws exception

}

觸發bug

request r = new request();

r.setclazz(integer.class);

string s = json.tojsonstring(r, serializerfeature.writeclassname);

system.out.println(s);

json.parseobject(s);//bug 觸發

我們看看內部

public static jsonobject parseobject(string text) 

return (jsonobject) json.tojson(obj);

}

如果改為json.parseobject(s, request.class);或者直接使用json.parse(str)就沒問題。

最後的建議:

不要使用json.parseobject(…)只使用json.parse(str);

資料序列化和反序列化

序列化 encoding 把python物件編碼轉換成json字串。反序列化 decoding 把json格式字串解碼為python物件。python中序列化通常有兩種方式 pickle模組和json模組 pickle模組的使用 對於大多數應用程式來講,dump 和load 函式的使用就是你使用pi...

Django 序列化資料之多表資料序列化

1.將查詢後的多張表的資料做序列化操作 2.為什麼要做三張表的序列化操作,因為三張表的字段有些相同有些不同 3.將三張表序列化後的資料進行合併 4.之後將合併後的序列化操作實現分頁查詢操作 data group1qeryset models.group1.objects.all group2qery...

C 的XML序列化和反序列化4

public class people xmlattribute age public int age xmlroot root public class student people xmlelement number public int number void main string args...