我在使用System.Runtime.Serialization.Json.DataContractJsonSerializer
类反序列化List<object>
中包含的DateTime示例时遇到了问题。我似乎无法让DateTime反序列化回原始类型。DataContractJsonSerializer
总是将其反序列化为格式为"/Date(1329159196126-0500)/"
的字符串类型。如果我使用强类型List<DateTime>
运行它,它将序列化和反序列化很好,但是我正在寻找方法,让序列化器识别和正确反序列化DateTimes时遇到object
的简单列表或数组。
注意,DateTimes是这个列表中除了原语和字符串之外唯一包含的类型。下面是我用来测试的代码片段。
var list = new List<object> { 27, "foo bar", 12.34m, true, DateTime.Now };
var serializer = new DataContractJsonSerializer(typeof (List<object>));
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, list);
ms.Position = 0;
var deserializedList = serializer.ReadObject(ms) as List<object>;
}
5条答案
按热度按时间koaltpgm1#
在.NET Framework 4.5版中,
DataContractJsonSerializer
有一个构造函数,它接受一个DataContractJsonSerializerSettings
对象,该对象可用于设置DateTimeFormat
:vvppvyoh2#
这看起来很奇怪,我猜这是因为DateTime不是JSON中识别的类型。但是,您可以滚动自己的IDataContractSurrogate来修改序列化/反序列化过程。
若要使用此功能,请在创建序列化程序时修改示例代码:
然后添加这个类:
sq1bmfud3#
如果
DataContractJsonSerializer
不是必须的,这里有一个使用Json.Net的解决方案。这是Json字符串
返回的类型为
long
、string
、double
、bool
和DateTime
2nbm6dog4#
您可以在序列化之前将 DateTime.Now 转换为字符串,然后
反序列化后将其转换回 DateTime。
转换为字符串的方法:
反序列化后转换回DateTime:
所以整个代码应该是这样的:
fjaof16o5#
这个问题的解决方案是使用
DataContractJsonSerializerSettings
将DateTimeFormat
更改为round trip o
,以便保留所有内容,然后成功转换。使用
Local
和Utc
进行测试