【原创】C#使用DataContractJsonSerializer进行Json方式序列化和反序列化

13 篇文章 0 订阅
7 篇文章 0 订阅

1、引用命名空间

引用dll:System.Runtime.Serialization

                System.ServiceModel;
                System.ServiceModel.Web;
                System.Web;

命名空间:
                using System.Runtime.Serialization;
                using System.Runtime.Serialization.Json;

2、序列化

 public static int SaveAsJsonConfig(Object obj, string FullPath)
 {
       if (obj == null) return -1;   
       try
       {
          using (var fs = new FileStream(FullPath, FileMode.Create, FileAccess.Write))
          {
             DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Object));
             jsonSerializer.WriteObject(fs, obj);//序列化到流   
           }
           return 0;
       }
       catch (System.Exception e)
       {
           return -1;
       }
}

3、反序列化

 public static Object LoadJsonConfig(string configFile)
 {
     try
     {
        DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Object));
        using (var fs = new FileStream(configFile, FileMode.Open, FileAccess.Read))
        {
          Object resultObject = Activator.CreateInstance<Object>();
          resultObject = (Object )jsonSerializer.ReadObject(fs);  
          
          return resultObject;
        } 
        catch (System.Exception e)
        {
           return null;
        }
    }
}

4、关于重复引用的问题

    若发生重复引用的情况,如A中有成员变量B,B中又有成员变量A。则可以使用以下方法避免:

    将重复引用的成员前面,标明关键字: [NonSerialized],即可解决

     对于重复引用的属性,如何标明不进行序列化? [NonSerialized]不管用?

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

转载于:https://www.cnblogs.com/known/p/8735413.html

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

问题:找不到DataContractJsonSerializerSettings和DateTimeFormat类型?可能是.net framework版本过旧,不支持。更新到.net framework 4.5以上即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值