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.OptOutpublic 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相关文章推荐
- json 序列化日期的问题
- JavaScriptSerializer 对 DateTime 数据类型的JSON序列化的问题
- spring+struts2+json框架序列化的问题
- python json 序列化反序列化 和 中文编码问题
- [IgnoreDataMember]:json序列化循环引用的问题
- json2.js 不能反序列化时间属性问题
- EF webapi json序列化 表间相互引用 无限循环问题解决方案
- 解决.Net MVC EntityFramework Json 序列化循环引用问题.
- Json序列化 解决Date问题
- JsonConvert序列化问题
- JavaScriptSerializer 对 DateTime 数据类型的JSON序列化的问题
- javascript中创建对象,并序列化为json,通过$.ajax的提交json数据到后台方法,取值为null的问题
- 解决JsonExSerializer无法反序列化JSON时间问题
- 解决json-lib的一些序列化循环处理问题
- 关于JQUERY JSON的反序列化类 using问题的解决方案
- JavaScriptSerializer 对 DateTime 数据类型的JSON序列化的问题
- JSON 序列化长度限制问题
- Json.NET序列化日期格式差异问题
- 探讨JQUERY JSON的反序列化类 using问题的解决方法
- Enum枚举序列化JSON value to string问题