Json.NET並不總是適當地考慮宣稱的ValueType
在Dictionary<KeyType,ValueType>
。Json.NET詞典序列化中的重大錯誤
這使得序列化Dictionary<string,object>
相當不可行,如果值恰好是其中DefaultContractResolver.CanConvertToString()
返回true,除非我失去了一些東西。 Rect
是.NET 4.0中的一種類型。我在Json.NET 4.5r11和5.0r2中試過這個。考慮以下代碼:
_requestSerializerJson = new JsonSerializer();
// Even setting TypeNameHandling to All doesn't change the deserialized result
Dictionary<string, object> dictionary = new Dictionary<string, object>();
Rect a = new Rect(1, 2, 3, 4);
dictionary.Add("myrect", a);
byte[] bytes;
using (MemoryStream requestStream = new MemoryStream())
using (var streamWriter = new StreamWriter(requestStream))
using (var writer = new JsonTextWriter(streamWriter))
{
_requestSerializerJson.Serialize(writer, dictionary);
writer.Flush();
bytes = requestStream.ToArray();
}
// Serialized to: {"myrect":"1,2,3,4"}
using (MemoryStream stream = new MemoryStream(bytes, 0, bytes.Length))
using (var textReader = new StreamReader(stream))
using (var reader = new JsonTextReader(textReader))
{
var b = _requestSerializerJson.Deserialize<Dictionary<string, object>>(reader);
}
// b is a Dictionary with a single *string* value "1,2,3,4" instead of a Rect!
我在想這個錯誤還是錯過了什麼?我只是切換到Json.NET從XmlSerializer的,因爲它是令人難以置信的更好的性能(尤其是在建設中),它是所有很容易過渡到,但運行到這個問題讓我害怕了一下。
看來,如果Json.NET將把某些東西寫成字符串,因爲對象類型爲CanConvertToString
()返回true,它需要寫出一個Json屬性,指出發生了對字符串的轉換,以便它可以在反序列化中可靠地「未轉換」...
什麼'詞典<字符串,Rect>'做反序列化? – asawyer 2013-04-08 17:49:31
它會工作。問題是當你爲你的值有一堆不同的對象類型的字典時。 – aggieNick02 2013-04-08 19:10:22