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();
}
elseif (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;

 会生成:带有属性名和空值的自循环体。

posted @ 2010-02-25 14:55  NewSea  阅读(1393)  评论(0编辑  收藏  举报