DataContractJsonSerializer序列化时间类型时转换为UTC溢出问题

Posted KNOWN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataContractJsonSerializer序列化时间类型时转换为UTC溢出问题相关的知识,希望对你有一定的参考价值。

问题描述

如下一个实体类,含有非空时间类型属性,默认是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溢出问题的主要内容,如果未能解决你的问题,请参考以下文章