1. 程式人生 > >DataContractJsonSerializer序列化時間類型時轉換為UTC溢出問題

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

設置 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溢出問題