学习之路十一:JSON(序列化与反序列化)
2012-04-13 21:14
162 查看
最近公司项目中用到了Json操作,从.NET后台读取数据,通过Json转化在传给“Andiron”端呈现,于是通过几天的学习,对它有了一点的理解!
[b]1.Json的理解[/b]
Json其实就是一个序列化和反序列化的操作,而通过序列化操作之后的数据可以跨平台使用,这就促使了可以使用两个平台,一个做后台,一个做前台,数据访问层通过Json来传递!
[b]2.可以序列化的标志 [/b]
从上面代码可以看出要通过添加[Serializable]特性来标志这个对象是可以序列化的!
[NonSerialized] 特性,如果在你的属性上面加上这个特性,就表示这个属性将不会被序列化!
[b]3.什么是序列化和可序列化[/b]
序列化首先从内存或其它文件中(MemorySteam或FileStream等)中把对象读取出来并通过一定方式进行序列化,最后进行输出!
反序列化首先会通过流操作(MemorySteam或FileStream等)读取传过来的值把它写入内存或文件中,然后通过一定序列化方式转化流对象 → 实体对象!
推荐文章 → [Serializable]在C#中的作用-NET 中的对象序列化
[b]4.使用二进制(BinaryFormatter)进行序列化[/b]
4.1序列化
4.2反序列化
[b]5.使用SoapFormatter进行序列化[/b]
这个跟二进制序列化不一样的地方是 → 最后的数据是以XML的形式存在!
5.1序列化
View Code
Note:除了XmlSerializer序列化调用的方法是“Deserialize”,其它的序列化都是使用“ReadObject”进行反序列化操作!
[b]8.一般的Json数据格式[/b][b] [/b]
[b]9.理解序列化操作 [/b]
下午在写公共类库的时候发现序列化其实就是流操作和序列化算法的结合,不管你使用哪一种流操作,最重要的还是你使用的是哪一种序列化算法,有“BinaryFormatter”,“SoapFormatter”,“XmlSerializer”,“DataContractSerialize”,“DataContractJsonSerializer”,“NetDataContractSerializer” 等,它们在序列化之后的格式有一定的差异!
[b]10.关于Json序列化时间的问题[/b]
没接触过不知道问题所在,接触过了才能猛然醒悟!
①如果把时间设置为“String”类型,如下:
②如果直接设置为“DataTime”,如下:
[b] 11.简单的封装Json操作类,解决时间问题 [/b]
[b]1.Json的理解[/b]
Json其实就是一个序列化和反序列化的操作,而通过序列化操作之后的数据可以跨平台使用,这就促使了可以使用两个平台,一个做后台,一个做前台,数据访问层通过Json来传递!
[b]2.可以序列化的标志 [/b]
[Serializable] public class MyPeople { public string Name { get; set; } public string FatherName { get; set; } }
从上面代码可以看出要通过添加[Serializable]特性来标志这个对象是可以序列化的!
[NonSerialized] 特性,如果在你的属性上面加上这个特性,就表示这个属性将不会被序列化!
[b]3.什么是序列化和可序列化[/b]
序列化首先从内存或其它文件中(MemorySteam或FileStream等)中把对象读取出来并通过一定方式进行序列化,最后进行输出!
反序列化首先会通过流操作(MemorySteam或FileStream等)读取传过来的值把它写入内存或文件中,然后通过一定序列化方式转化流对象 → 实体对象!
推荐文章 → [Serializable]在C#中的作用-NET 中的对象序列化
[b]4.使用二进制(BinaryFormatter)进行序列化[/b]
4.1序列化
MyPeople myPeople = new MyPeople() { Name = "yangcaogui", FatherName = "caoxiaolong" }; IFormatter binaryFormatter = new BinaryFormatter(); using (Stream stream = new FileStream("one.txt", FileMode.Create, FileAccess.Write, FileShare.None)) //也可以使用MemoryStream内存流 { binaryFormatter.Serialize(stream, myPeople); stream.Close(); }
4.2反序列化
IFormatter binaryFormatter = new BinaryFormatter(); using (Stream streamOne = new FileStream("one.txt", FileMode.Open, FileAccess.Read, FileShare.None)) { MyPeople myPeopleOne = (MyPeople)binaryFormatter.Deserialize(streamOne); Console.WriteLine(myPeopleOne.Name + "\t" + myPeopleOne.FatherName); }
[b]5.使用SoapFormatter进行序列化[/b]
这个跟二进制序列化不一样的地方是 → 最后的数据是以XML的形式存在!
5.1序列化
View Code
Note:除了XmlSerializer序列化调用的方法是“Deserialize”,其它的序列化都是使用“ReadObject”进行反序列化操作!
[b]8.一般的Json数据格式[/b][b] [/b]
[b]9.理解序列化操作 [/b]
下午在写公共类库的时候发现序列化其实就是流操作和序列化算法的结合,不管你使用哪一种流操作,最重要的还是你使用的是哪一种序列化算法,有“BinaryFormatter”,“SoapFormatter”,“XmlSerializer”,“DataContractSerialize”,“DataContractJsonSerializer”,“NetDataContractSerializer” 等,它们在序列化之后的格式有一定的差异!
[b]10.关于Json序列化时间的问题[/b]
没接触过不知道问题所在,接触过了才能猛然醒悟!
①如果把时间设置为“String”类型,如下:
②如果直接设置为“DataTime”,如下:
[b] 11.简单的封装Json操作类,解决时间问题 [/b]
public static class JsonOperation<T> { private static readonly DataContractJsonSerializer DataContractJsonSerializer = new DataContractJsonSerializer(typeof(T)); //序列化 public static string JsonSerializeOperation(T obj) { if (obj == null) throw new Exception(); string str = ""; using (MemoryStream memoryStream = new MemoryStream()) { DataContractJsonSerializer.WriteObject(memoryStream, obj); str = Encoding.UTF8.GetString(memoryStream.ToArray()); } return ConvertJsonTimeToDateTime(str); } //反序列化 public static T JsonDeserializeOperation(string str) { if (string.IsNullOrEmpty(str)) throw new Exception(); using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(str))) { return (T)DataContractJsonSerializer.ReadObject(memoryStream); } } //二进制序列化 public static string BinarySerializeOperation(T obj) { string jsonString = ""; if (obj == null) throw new Exception(); IFormatter formatter = new BinaryFormatter(); using (MemoryStream memoryStream = new MemoryStream()) { formatter.Serialize(memoryStream, obj); jsonString = Encoding.UTF8.GetString(memoryStream.ToArray()); } return jsonString; } //二进制反序列化 public static T BinaryDeserializeOperation(string str) { if (string.IsNullOrEmpty(str)) throw new Exception(); IFormatter formatter = new BinaryFormatter(); using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(str))) { return (T)formatter.Deserialize(memoryStream); } } /// <summary> /// 把Json中的时间转化为正规时间,现在是Json数据格式,需要转化普通的时间格式 → yyyy-MM-dd HH:MM:ss /// </summary> /// <param name="jsonString">Json Time</param> /// <returns></returns> private static string ConvertJsonTimeToDateTime(string jsonString) { if (string.IsNullOrEmpty(jsonString)) throw new Exception(); const string matchDate = @"\\/Date\((\d+)\+\d+\)\\/"; Regex regex = new Regex(matchDate); Match match = regex.Match(jsonString); foreach (var matchValue in match.Groups) { if (matchValue is Match) { Match matchOne = (Match)matchValue; DateTime dateTime = JsonOperation<DateTime>.JsonDeserializeOperation(string.Format("\"{0}\"", matchOne.Value)); // This is very important. jsonString = jsonString.Replace(matchOne.Value, dateTime.ToString("yyyy-MM-dd HH-MM-ss")); } } return jsonString; } }
相关文章推荐
- Xstream 序列化和 反序列化 XML Object JSON之间相互的
- C# 利用 Json.NET/LitJSON序列化json(第三方DLL)
- jackson 实体转json 为NULL或者为空不参加序列化
- Json序列化之.NET开源类库Newtonsoft.Json的研究
- json序列化技巧 时间问题处理
- Jquery 将表单序列化为Json对象.同时提交多个表单的参数
- Java下利用Jackson进行JSON解析和序列化
- 跟我撩fastjson-第三章:Java泛型的序列化和反序列化
- 探讨JQUERY JSON的反序列化类 using问题的解决方法
- C# JSON字符串序列化与反序列化(转)
- 在C#中,Json的序列化和反序列化的几种方式总结
- 提供一个Json传到服务端序列化json参数的Filter类供大家参考
- JsonTools(java Json序列化/反序列化)简单使用
- json 序列化和反序列化
- 如何使用ABAP代码反序列化JSON字符串成ABAP结构
- Json序列化问题
- 解决json-lib的一些序列化循环处理问题
- C#实现JSON序列化与反序列化介绍
- windows phone8.1:Xml,Json序列化和反序列化
- Json序列化为对象方法