序列化和发序列化
使用场景:随着技术的更新,对数据的处理方式也变得多样化,如:xml/html/json/xpath 等等,现在我主要是想说一下(反)序列化中对象和json字符串的互相转换。json 是一种非常方便的数据存储格式,想要了解更多json方面的知识,请点击;http://www.json.org/json-zh.html.
1. 使用 System.Web.Script.Serialization.JavaScriptSerializer 使用这个泪序列化和发序列化。
首先新建一个实体类。
public class SerializerDemo { public int ID { set; get; } public string OjbectName { set; get; } }
接着通过以下代码序列化和发序列化
protected void Page_Load(object sender, EventArgs e) { List<SerializerDemo> list = new List<SerializerDemo> { new SerializerDemo(){ID=001,OjbectName="SerializerOne"}, new SerializerDemo(){ID=002,OjbectName="SerializerTwo"}, new SerializerDemo(){ID=003,OjbectName="Serializer"} }; SerializerDemo demo = new SerializerDemo() { ID=100,OjbectName="serializerDemo"}; // 1.0 将一个对象序列化为json字符串 System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); string json = serializer.Serialize(list); // 将一个集合序列化为一个json数组字符串 string jsonOne = serializer.Serialize(demo); // 将一个对象序列化为一个json字符串 tbJson.Text = json; // 反序列json字符串为对象,对于这种方式,数组的json字符串不支持反序列化 string newJson = json.Replace("[","").Replace("]",""); //var newObjects = serializer.Deserialize<List<SerializerDemo>>(newJson); //for (int i = 0; i < newObjects.Count; i++) //{ // TextBox1.Text = newObjects[i].ID + " ," + newObjects[i].OjbectName; //} SerializerDemo objects = serializer.Deserialize<SerializerDemo>(jsonOne) as SerializerDemo; tbObject.Text = "Id=" + objects.ID + "Name="+objects.OjbectName; }
2. 这是从网上找到的一些序列化的方法,加上注释。
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization.Json; using System.Text; using System.Text.RegularExpressions; using System.Web; namespace WebSerializer { /// <summary> /// Json 序列化和反序列化辅助类 /// </summary> public class JsonHelper { /// <summary> /// json 的序列化 /// </summary> /// <typeparam name="T">类型参数</typeparam> /// <param name="t">要序列化的对象</param> /// <returns>返回序列化后的Json字符串</returns> public static string JsonSerializer<T>(T t) { // 将对象序列化为 JavaScript 对象表示法 (JSON),并将 JSON 数据反序列化为对象 DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(); // 将指定对象序列化为 JavaScript 对象表示法 (JSON) 数据,并将生成的 JSON 写入流中。 ser.WriteObject(ms, t); // 将 字节数组 转换为 字符串 string jsonString = Encoding.UTF8.GetString(ms.ToArray()); ms.Close(); //替换Json的Date字符串 string p = @"\\/Date\((\d+)\+\d+\)\\/"; MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString); Regex reg = new Regex(p); jsonString = reg.Replace(jsonString, matchEvaluator); return jsonString; } /// <summary> /// JSON 的反序列化 /// </summary> /// <typeparam name="T">类型参数</typeparam> /// <param name="jsonString">需要序列化的Json字符串</param> /// <returns>返回json反序列化的后的对象</returns> public static T JsonDeSerialiser<T>(string jsonString) where T : class { //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式 string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}"; MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate); Regex reg = new Regex(p); jsonString = reg.Replace(jsonString, matchEvaluator); DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); // 将josn格式字符串 以byte[]的形式存入到内存流中 MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); // 以json格式读取文档流,并且返回序列化后的对象 T obj = ser.ReadObject(ms) as T; return obj; } /// <summary> /// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串 /// </summary> private static string ConvertJsonDateToDateString(Match m) { string result = string.Empty; DateTime dt = new DateTime(1970, 1, 1); dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value)); dt = dt.ToLocalTime(); result = dt.ToString("yyyy-MM-dd HH:mm:ss"); return result; } /// <summary> /// 将时间字符串转为Json时间 /// </summary> private static string ConvertDateStringToJsonDate(Match m) { string result = string.Empty; DateTime dt = DateTime.Parse(m.Groups[0].Value); dt = dt.ToUniversalTime(); TimeSpan ts = dt - DateTime.Parse("1970-01-01"); result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds); return result; } } }
3. javascript对时间的处理。
function ChangeDateFormat(jsondate) { jsondate = jsondate.replace("/Date(", "").replace(")/", ""); if (jsondate.indexOf("+") > 0) { jsondate = jsondate.substring(0, jsondate.indexOf("+")); } else if (jsondate.indexOf("-") > 0) { jsondate = jsondate.substring(0, jsondate.indexOf("-")); } var date = new Date(parseInt(jsondate, 10)); var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1; var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate(); return date.getFullYear() + "-" + month + "-" + currentDate; }