分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

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

发布时间:2023-09-06 01:48责任编辑:蔡小小关键词:暂无标签

问题描述

如下一个实体类,含有非空时间类型属性,默认是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溢出问题

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

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved