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);
}

原文地址:https://www.cnblogs.com/known/p/8735413.html

时间: 2024-08-29 15:07:48

DataContractJsonSerializer序列化时间类型时转换为UTC溢出问题的相关文章

将服务器时间类型改为UTC(0000)

方法一: # timedatectl  set-timezone UTC #  timedatectl set-time "YYYY-MM-DD HH:MM:SS" #  timedatectl set-time   "HH:MM:SS" # timedatectl 我们可以看到,服务器时间类型更改为UTC了 # ll   /etc/locatime lrwxrwxrwx. 1 root root 25 1月  14 08:30 /etc/localtime -&g

1 Java中的时间类型

总结:sql中的时间转 util的时间直接赋值即可:反过来,必须先吧util下的时间转换成毫秒,再通过sql的构造器生成sql的时间格式. 1 Java中的时间类型 java.sql包下给出三个与数据库相关的日期时间类型,分别是: l Date:表示日期,只有年月日,没有时分秒.会丢失时间: l Time:表示时间,只有时分秒,没有年月日.会丢失日期: l Timestamp:表示时间戳,有年月日时分秒,以及毫秒. 这三个类都是java.util.Date的子类. 2 时间类型相互转换 把数据库

时间类型

Java中的时间类型 java.sql包下给出三个与数据库相关的日期时间类型,分别是: Date:表示日期,只有年月日,没有时分秒.会丢失时间: Time:表示时间,只有时分秒,没有年月日.会丢失日期: Timestamp:表示时间戳,有年月日时分秒,以及毫秒. 这三个类都是java.util.Date的子类. 时间类型相互转换 把数据库的三种时间类型赋给java.util.Date,基本不用转换,因为这是把子类对象给父类的引用,不需要转换. java.sql.Date date = - jav

Mysql 建表时,日期时间类型选择

mysql(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值表示  DATETIME  8 bytes  YYYY-MM-DD HH:MM:SS  1000-01-01 00:00:00 9999-12-31 23:59:59 0000-00-00 00:00:00  TIMESTAMP  4 bytes  YYYY-MM-DD HH:MM:SS  197001010

数据库里面DataTime时间类型字段,如果为null时

tran.TransactionTime = bet.CreationDate.ToString() == "0001/1/1 0:00:00" ? DateTime.Now : bet.CreationDate; 数据库里面DataTime时间类型字段,如果为null时,查询出来时间值为"0001/1/1 0:00:00" 这是一个溢出SqlDateTime超出范围的时间值,将它再插入数据库时会报错的 数据库里面DataTime时间类型字段,如果为null时,布布

numeric 转换为数据类型 (null) 时出现算术溢出错误

mssql数据同步到mysql时提示错误如下: 消息 8115,级别 16,状态 14,第 1 行 将 numeric 转换为数据类型 (null) 时出现算术溢出错误 问题分析如下: 1.数据字段类型限制超出最小最大值 2.mysql字段属性有个“unsigned”限制, 非负数

复制一张表的数据到另一张表,jq.grid里面有时间类型数据时展示不了数据

1.复制一张表的数据到另一张表 insert into jct_sys_lock_tbl_new  (BGN_DT, END_DT, TYPE, DESCR, flag, format, range, count)  select BGN_DT, END_DT, TYPE, DESCR, flag, format, range, count    from jct_sys_lock_tbl 也可以: insert into jct_sys_lock_tbl_new  select *    fr

Spring MVC+Fastjson之时间类型序列化

时间类型序列化: 注意红色代码,必须引入fastjson的JSONField类,而非其它. import com.alibaba.fastjson.annotation.JSONField; @Entity @Table(name="User") public class User{ @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id

json-lib反序列化时(JSONObject.toBean),时间类型为空的处理

需求: 在我们的项目里希望JsonString传入日期类型值为空时,JSONObject.toBean时可以将Java对象的该日期属性设为null. 解决过程: json-lib反序列化Json字符串为Java对象,可以通过以下代码处理日期字段: 1 public static <T> T JsonToBean(Class<T> clazz, String JsonString) { 2 JSONUtils.getMorpherRegistry().registerMorpher(