DataContractJsonSerializer序列化時間類型時轉換爲UTC溢出問題

問題描述

以下一個實體類,含有非空時間類型屬性,默認是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);
}
相關文章
相關標籤/搜索