DataContractJsonSerializer序列化時間類型時轉換為UTC溢出問題
阿新 • • 發佈:2018-04-08
設置 arr AD toa C# exception default AR AC
問題描述
如下一個實體類,含有非空時間類型屬性,默認是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); }
DataContractJsonSerializer序列化時間類型時轉換為UTC溢出問題