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以上即可。