使用JavaScriptSerializer进行JSON序列化时自定义JavaScriptConverter的问题

showlin showlin 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
有史以来第一次发这么长的题目,先汗一个~~~
要序列化的类如下

public class TestAAA
{
public string Name
{
get;
set;
}
public DateTime? BirthDay
{
get;
set;
}
}


TestAAA obj = new TestAAA
{
Name = "张三",
BirthDay = DateTime.Now
};
JavaScriptSerializer jss = new JavaScriptSerializer();
TextBox1.Text= jss.Serialize(obj);

在使用JavaScriptSerializer序列化后得到这么个字符串
{"Name":"张三","Birthday":"\/Date(1340693123252)\/"}
因为想要用yyyyMMdd的方式进行序列化输出,因此想到了自定义JavaScriptConverter


public class DateTimeConverter : JavaScriptConverter
{

public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
if (string.IsNullOrEmpty(dictionary["Value"].ToString()))
return null;

return DateTime.Parse(dictionary["Value"].ToString());
}

public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{

IDictionary<string, object> result = new Dictionary<string, object>();
if (obj == null)
result["Value"] = string.Empty;
else
result["Value"] = ((DateTime)obj).ToString("yyyy-MM-dd HH:mm:ss");
return result;
}

public override IEnumerable<Type> SupportedTypes
{
get { yield return typeof(DateTime); }
}
}


JavaScriptSerializer jss = new JavaScriptSerializer();
jss.RegisterConverters(new JavaScriptConverter[] { new DateTimeConverter() });
TextBox1.Text= jss.Serialize(obj);

序列化后得到这样的结果
{"Name":"张三","BirthDay":{"Value":"2012-06-26 17:11:13"}}

可是反序列化的时候,问题出来了
JavaScriptSerializer jss = new JavaScriptSerializer();
jss.RegisterConverters(new JavaScriptConverter[] { new DateTimeConverter() });
TestAAA obj = jss.Deserialize<TestAAA>(TextBox1.Text);

在
TestAAA obj = jss.Deserialize<TestAAA>(TextBox1.Text);
这一句报了“未将对象引用设置到对象的实例”的错误

把反序列化代码改成这样,并加上断点
JavaScriptSerializer jss = new JavaScriptSerializer();
jss.RegisterConverters(new JavaScriptConverter[] { new DateTimeConverter() });
object obj = jss.DeserializeObject(TextBox1.Text);
TestAAA a = jss.ConvertToType<TestAAA>(obj);

第3行能正常执行,得到的obj是一个IDictionary<string,object>集合
第4行报“未将对象引用设置到对象的实例”的错误

错误的内部堆栈如下:
System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +1059
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +71
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +147
System.Web.Script.Serialization.ObjectConverter.AssignToPropertyOrField(Object propertyValue, Object o, String memberName, JavaScriptSerializer serializer, Boolean throwOnError) +202
System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +1177
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +71
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) +147
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o, Type type, JavaScriptSerializer serializer) +21
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit) +48
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(String input) +70


reflector反进去看了一下,没看出道道来,为啥这个反序列化不行???
...全文

相关推荐

评论 9
收藏 已收藏
分享
返回顶部
showlin
.NET社区 62,271 成员 668,968 内容