以下一个实体类,含有非空时间类型属性,默认是C#的最小时间,在使用DataContractJsonSerializer将该类对象序列化成JSON时,抛出异常信息:System.Runtime.Serialization.SerializationException:“在转换为 UTC 时,大于 DateTime.MaxValue 或小于 DateTime.MinValue 的 DateTime 值没法序列化为 JSON。”。
实体类json
public class Post { public string Id { get; set; } public string Title { get; set; } public string Content { get; set; } public DateTime CreateTime { get; set; } }
序列化类c#
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,将时间格式设置一下便可成功序列化。设置以下:ide
private DataContractJsonSerializer GetJsonSerializer<T>() { var settings = new DataContractJsonSerializerSettings { DateTimeFormat = new DateTimeFormat("yyyy-MM-dd HH:mm:ss") }; return new DataContractJsonSerializer(typeof(T), settings); }