您的位置:首页 > Web前端 > JavaScript

Json.Net4.5 序列化问题

2015-01-15 20:34 246 查看

问题

[DataContract]
public class pcc
{
[DataMember]
public string Name { get; set; }
}

public class ccc : pcc
{
public string cName { get; set; }
}


由于 pcc 定义了 DataContract ,所以要求下面的所有属性要定义 DataMember 才能进行序列化。否则按 IgnoreDataMember 处理。

Json.Net,你 太自大了,谁给你的权力?!

修改源码

类:JsonTypeReflector.GetObjectMemberSerialization 想办法让它返回 MemberSerialization.OptOut

public static MemberSerialization GetObjectMemberSerialization(Type objectType, bool ignoreSerializableAttribute)
{
JsonObjectAttribute objectAttribute = GetCachedAttribute<JsonObjectAttribute>(objectType);
if (objectAttribute != null)
return objectAttribute.MemberSerialization;

#if !NET20
DataContractAttribute dataContractAttribute = GetDataContractAttribute(objectType);
if (dataContractAttribute != null)
return MemberSerialization.OptIn;
#endif

#if !(NETFX_CORE || PORTABLE40 || PORTABLE)
if (!ignoreSerializableAttribute)
{
SerializableAttribute serializableAttribute = GetCachedAttribute<SerializableAttribute>(objectType);
if (serializableAttribute != null)
return MemberSerialization.Fields;
}
#endif

// the default
return MemberSerialization.OptOut;
}


public static DataContractAttribute GetDataContractAttribute(Type type)
{
// DataContractAttribute does not have inheritance
Type currentType = type;

while (currentType != null)
{
DataContractAttribute result = CachedAttributeGetter<DataContractAttribute>.GetAttribute(currentType);
if (result != null)
return result;

currentType = currentType.BaseType();
}

return null;
}


原方法为:

public static DataContractAttribute GetDataContractAttribute(Type type)
{
// DataContractAttribute does not have inheritance
Type currentType = type;

while (currentType != null)
{
DataContractAttribute result = CachedAttributeGetter<DataContractAttribute>.GetAttribute(currentType);
if (result != null)
return result;

currentType = currentType.BaseType();
}

return null;
}


修改为:

public static DataContractAttribute GetDataContractAttribute(Type type)
{
return CachedAttributeGetter<DataContractAttribute>.GetAttribute(type);
}


即不判断基类的 DataContract 属性。

无法反序列化 英文日期

如:Apr 14, 2015 6:05:28 PM

找到: IsoDateTimeConverter.ReadJson

最后的代码:

if (!string.IsNullOrEmpty(_dateTimeFormat))
return DateTime.ParseExact(dateText, _dateTimeFormat, Culture, _dateTimeStyles);
else
return DateTime.Parse(dateText, Culture, _dateTimeStyles);


修改为:

//在反序列化的时候,就不要使用 _dateTimeFormat 了,因为反序列的途径很多,而 _dateTimeFormat 指定的输出格式
var retDate = DateTime.MinValue;
if (DateTime.TryParse(dateText, out retDate))
{
return retDate;
}

if (!string.IsNullOrEmpty(_dateTimeFormat))
return DateTime.ParseExact(dateText, _dateTimeFormat, Culture, _dateTimeStyles);
else
return DateTime.Parse(dateText, Culture, _dateTimeStyles);


vs2013 编译Json.Net 的问题

发现的 Vs2012,Vs2013编译问题

一个Solution,两个Web Mvc 项目(A,B),编译其中A,B无法运行(Json.net程序集变为了老的程序集),编译B,A无法运行(Json.net 程序集变为老的程序集)。

编译DbEnt,Mvc项目的bin里,也会自动Copy一些Dll,包含老的Json.Net 。

Json.Net 程序集并不是从指定目录Copy的。而是一个老版本, 4.5.11.* 。它是从 D:\Program Files (x86)\Microsoft Visual Studio 12.0\Blend 这里Copy 的。

把D:\Program Files (x86)\Microsoft Visual Studio 12.0\Blend 里的 json.net 删除,就好了。

关于修改Json.Net后,不能引用原来的Json.Net的问题

1.首先,修改Json.Net的在项目属性,程序集名称改为: MyJson , 也可以直接修改Dll的名字

2.添加MyJson的引用,在引用的Dll属性上,修改 别名 为: MyJson,默认是 global

3.在需要使用 MyJson 的地方,在文件最前面,添加 extern alias MyJson;

4.使用 MyJson:: 前缀,来指定 MyJson 程序集里的类。

5.如果使用新的 Json.Net 程序集类,则直接使用,无影响。

之前的文章:

http://www.cnblogs.com/newsea/archive/2010/02/25/1673468.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: