以下一個實體類,含有非空時間類型屬性,默認是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); }