问题描述
如下一个实体类,含有非空时间类型属性,默认是C#的最小时间,在使用DataContractJsonSerializer将该类对象序列化成JSON时,抛出异常信息:System.Runtime.Serialization.SerializationException:“在转换为 UTC 时,大于 DateTime.MaxValue 或小于 DateTime.MinValue 的 DateTime 值无法序列化为 JSON。”。
实体类
public class Post{ ???public string Id { get; set; } ???public string Title { get; set; } ???public string Content { get; set; } ???public DateTime CreateTime { get; set; }}
序列化类
public class DataContractProvider{ ???public string Serialize<T>(T value) ???{ ???????var serializer = GetJsonSerializer<T>(); ???????using (var stream = new MemoryStream()) ???????{ ???????????serializer.WriteObject(stream, value); ???????????return Encoding.Default.GetString(stream.ToArray()); ???????} ???} ???public T Deserialize<T>(string json) ???{ ???????var serializer = GetJsonSerializer<T>(); ???????var bytes = Encoding.Default.GetBytes(json); ???????using (var stream = new MemoryStream(bytes)) ???????{ ???????????return (T)serializer.ReadObject(stream); ???????} ???} ???private DataContractJsonSerializer GetJsonSerializer<T>() ???{ ???????return new DataContractJsonSerializer(typeof(T)); ???}}
解决办法
尝试了如下几种方法:
1.将DateTime改成可空类型DateTime?,则可以序列化成功,但实际上该属性的时间类型为非空,因此不能算解决。
2.在构造DataContractJsonSerializer时,添加序列化设置DataContractJsonSerializerSettings,将时间格式设置一下即可成功序列化。设置如下:
private DataContractJsonSerializer GetJsonSerializer<T>(){ ???var settings = new DataContractJsonSerializerSettings ???{ ???????DateTimeFormat = new DateTimeFormat("yyyy-MM-dd HH:mm:ss") ???}; ???return new DataContractJsonSerializer(typeof(T), settings);}