Newtonsoft.Json 修改記錄
1.Newtonsoft.Json 可以反序列 但不能還原序列化 KeyValuePaire<TKey,TValue> , 是因為:
KeyValuePaire 的兩個屬性 Key , Value 都是唯讀.且,沒有預設建構函式.
在檔案:Newtonsoft.Json\Newtonsoft.Json\Utilities\ReflectionUtils.cs 裡有一個函數:HasDefaultConstructor 作者的判斷裡有: 只要是實值型別,就會有預設建構函式. 這是不對的.
去掉 下面這兩句:
if (t.IsValueType)
return true;
2.對於 具有屬性 (Attribute) Browsable = false 是不用序列化的.
\Utilities\ReflectionUtils.cs (GetFieldsAndProperties 487行後添加)
代碼
for (int i = 0; i < targetMembers.Count; i++) { MemberInfo member = targetMembers[i]; object[] objs = member.GetCustomAttributes(typeof(BrowsableAttribute), true); if (objs != null && objs.Length > 0)
{ if ((objs[0] as BrowsableAttribute).Browsable == false) { targetMembers.RemoveAt(i); i--; } } }
3. DateTime序列化錯誤:
\JsonWriter.cs (WriteValue) 修改 1036行
代碼
case TypeCode.DateTime: string dtValue = ""; DateTime? dt = convertible as DateTime?; if (dt.HasValue == false) { return; } if (dt.Value.Hour == 0 && dt.Value.Minute == 0 && dt.Value.Second
== 0) { dtValue = dt.Value.ToShortDateString(); } else if (dt.Value.Year == 0 && dt.Value.Month == 0 && dt.Value.Day == 0) { dtValue = dt.Value.ToShortTimeString(); }
else dtValue = dt.Value.ToString(); WriteValue(dtValue); return;
4.循環參考自己的問題。
\JsonSerializer.cs (WriteMemberInfoProperty) 838 行: 修改
case ReferenceLoopHandling.Error:
return;
再狠點:\JsonSerializer.cs (SerializeObject) 879 行。 添加:
if (writer.SerializeStack.Count > 0 && writer.SerializeStack[0].GetType() == value.GetType()) return;
會產生:帶有屬性名稱和空值的自迴圈體。