在我的项目代码中,我习惯于把一些对象进行序列化,然后存入数据库,出于节省空间的考虑,我一般使用.net 4.0中带的DataContractJsonSerializer类来实现,一般我我会写两个方法(Serialize方法和Deserialize方法)放到我的Utility项目中。

Serialize和Deserialize方法分别如下:

 

/// <summary>
/// Serialize T to string
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public static string Serialize<T>(T item)
{
if (item == null) return string.Empty;

var serializer
= new DataContractJsonSerializer(item.GetType());

using (var ms = new MemoryStream())
{
serializer.WriteObject(ms, item);

var sb
= new StringBuilder();
sb.Append(Encoding.UTF8.GetString(ms.ToArray()));

return sb.ToString();
}
}

/// <summary>
/// Deserialize string back to T
/// </summary>
/// <param name="jsonString"></param>
/// <returns></returns>
public static T Deserialize<T>(string jsonString)
{
if (string.IsNullOrEmpty(jsonString)) return default(T);

var ser
= new DataContractJsonSerializer(typeof(T));

using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
{
T jsonObject
= (T)ser.ReadObject(ms);
return jsonObject;
}
}

但是在使用过程中碰到过两种问题,第一个是DateTime.MinValue不能序列化的问题。错误提示信息如下:

在转换为 UTC 时,大于 DateTime.MaxValue 或小于 DateTime.MinValue 的 DateTime 值无法序列化为 JSON。

根据错误信息的意思来看,其意思是在将DateTime.MinValue转换为Utc时间后,再序列化出现错误,而且转换为Utc时间后,Utc时间出现了大于DateTime.MaxValue或小于DateTime.MinValue的情况,真是百思不得其解。难道在DataContract将LocalTime的时间转换为UtcTime时不时使用TimeZoneInfo.ConvertTimeToUtc的吗?

对于这个问题没办法,我只好使用SqlDateTime.MinValue来代替DateTime.MinValue,而且每次都要加一层转换,也比较麻烦。

第二个问题是,装箱后数据类型的丢失问题,例如把一个Guid类型的数据给一个object的属性或成员,而序列化后,再反序列化回来的对象的值(object)则不再是一个Guid的值了,而变成了一个string类型的值了。这个问题是我在把一些界面操作数据保存到本地文本文件然后加载这些文件序列化的时候发现的。这个问题对于DataContractJsonSerializer来说似乎是个很难解决的问题。所以在使用DataContractJsonSerializer的时候应尽可能的避免使用object类型的设计。原示例代码如下:

Data2 d2 = new Data2 {  Uid = Guid.NewGuid (), Value = Guid.NewGuid() };
Console.WriteLine("d2.Value is Guid: {0}", d2.Value is Guid);
string d2String = Serialize<Data2>(d2);
Console.WriteLine("----------------------------------------------------");
Console.WriteLine(d2String);
Console.WriteLine("----------------------------------------------------");
Data2 d22 = Deserialize<Data2>(d2String);
Console.WriteLine("d22.Value is Guid: {0}", d22.Value is Guid);

作者: Bright Zhang 发表于 2011-07-04 02:44 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架