Fork me on GitHub
C# 序列化与反序列化

C# 序列化与反序列化


摘要: C#线程间互相通信主要用到两个类:AutoResetEvent和ManualResetEvent。一、AutoResetEventAutoResetEvent允许线程通过发信号互相通信,线程通过调用AutoResetEvent上的WaitOne来等待信号。如果AutoResetEvent为非终止状态...阅读全文
posted @ 2014-04-18 08:08 黑树 阅读(252) | 评论 (1) 编辑
 
摘要: CLR环境中给我们内置了几个常用委托Action、 Action、Func、Predicate,一般我们要用到委托的时候,尽量不要自己再定义一 个委托了,就用系统内置的这几个已经能够满足大部分的需求,且让代码符合规范。一、ActionAction封装的方法没有参数也没有返回值,声明原型为:1 pub...阅读全文
posted @ 2014-04-17 20:03 黑树 阅读(680) | 评论 (3) 编辑
 
摘要: 序列化是把一个内存中的对象的信息转化成一个可以持久化保存的形式,以便于保存或传输,序列化的主要作用是不同平台之间进行通信,常用的有序列化有json、xml、文件等,下面就逐个讲下这三种序列化的方法。一、序列化为jsonC#中用于对象和json相互转换的原生类有两个:DataContractJsonS...阅读全文
posted @ 2014-04-17 13:47 黑树 阅读(608) | 评论 (0) 编辑
 
摘要: 刚接触Mvc的时候以为Mvc和传统的三层一样,也是一种架构模式,后来了解多了,才明白Mvc最大的功能就是将传统的Asp.Net按物理地址搜索文件改为按逻辑搜索,在路由中将访问地址映射到对应的控制器,由控制器再去查找对应的页面,严格来说Mvc是表现层上一种设计模式,如果一个项目用到Mvc和三层架构,可...阅读全文
posted @ 2014-04-16 14:53 黑树 阅读(34) | 评论 (0) 编辑
 
摘要: Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数。通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。在C#中的Linq中的大部分就是由扩展方法和Lambda 表达式共同来实现,如:1 public static IEnumerable Where(this IEnumerable source, Func predicate);2 public static IEnumerable Select(this IEnumerable source, Func selector);下面使用一个Where方法,体现委托向Lambda 表达式优化的阅读全文
posted @ 2014-04-10 09:07 黑树 阅读(25) | 评论 (0) 编辑
 
摘要: C#中的事件是建立在委托的基础上,标准的事件模型应该包括以下几点:声明一个用于定义事件的委托,这里用系统自带的泛型委托原型EventHandler,如:public delegate void EventHandler(object sender,TEventArgse);这里面的TEventArgs是由我们自定义的参数类型,继承自EventArgs基类事件参数的名称以EventArgs结束声明事件的委托原型即EventHandler,它的返回值为void声明事件的委托原型即EventHandler,它有两个参数:sender和e,sender表示事件触发者,e表示事件触发时的参数事件的声明是阅读全文
posted @ 2014-04-09 14:21 黑树 阅读(23) | 评论 (0) 编辑
 

序列化是把一个内存中的对象的信息转化成一个可以持久化保存的形式,以便于保存或传输,序列化的主要作用是不同平台之间进行通信,常用的有序列化有json、xml、文件等,下面就逐个讲下这三种序列化的方法。

一、序列化为json

C#中用于对象和json相互转换的原生类有两个:DataContractJsonSerializer和JavaScriptSerializer,其中JavaScriptSerializer主要用于web的浏览器和服务器之间的通信。这里主要讲DataContractJsonSerializer的使用,要使用DataContractJsonSerializer,先要在项目中引用System.Runtime.Serialization。首先准备一个测试的类Book:

复制代码
 1     [DataContract]
 2     class Book
 3     {
 4         [DataMember]
 5         public int ID { get; set; }
 6 
 7         [DataMember]
 8         public string Name { get; set; }
 9 
10         [DataMember]
11         public float Price { get; set; }
12     }
复制代码
[DataContract]指定该类型要定义或实现一个数据协定,并可由序列化程序(如 System.Runtime.Serialization.DataContractSerializer)进行序列化。
[DataMember]当应用于类型的成员时,指定该成员是数据协定的一部分并可由 System.Runtime.Serialization.DataContractSerializer进行序列化。
然后先创建一个Book对象,实例化一个DataContractJsonSerializer实例,最后用该实例的WriteObject()方法将对象写到流中,代码如下:
复制代码
 1      class Program
 2      {
 3          static void Main(string[] args)
 4          {
 5              Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };
 6  
 7              //序列化json
 8              DataContractJsonSerializer formatter= new DataContractJsonSerializer(typeof(Book));
 9              using (MemoryStream stream = new MemoryStream())
10              {
11                  formatter.WriteObject(stream, book);
12                  string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
13                  Console.WriteLine(result);
14              }
15          }
16      }
复制代码
程序的输出结果如图:

将一个json格式的字符串反序列化为对象是用DataContractJsonSerializer实例的ReadObject()方法,代码如下:
复制代码
 1      class Program
 2      {
 3          static void Main(string[] args)
 4          {
 5              Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };15 
 6              //反序列化json
 7              string oriStr = "{\"ID\":101,\"Name\":\"C#程序设计\",\"Price\":79.5}";
 8              DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(Book));
 9              using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(oriStr)))
10              {
11                  Book outBook = formatter.ReadObject(stream) as Book;
12                  Console.WriteLine(outBook.ID);
13                  Console.WriteLine(outBook.Name);
14                  Console.WriteLine(outBook.Price);
15              }
16              Console.Read();
17          }
18      }
复制代码

程序输出结果如图:

我们也可以把上面的json序列化与反序列为封装成泛型方法,这样可以公用,全部代码如下:
复制代码
 1      class Program
 2      {
 3          static void Main(string[] args)
 4          {
 5              Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };
 6  
 7              //序列化json
 8              string result = Serializer.ObjectToJson<Book>(book);
 9              Console.WriteLine(result);
10  
11              //反序列化json
12              string oriStr = "{\"ID\":101,\"Name\":\"C#程序设计\",\"Price\":79.5}";
13              Book outBook = Serializer.JsonToObject<Book>(oriStr);
14              Console.WriteLine(outBook.ID);
15              Console.WriteLine(outBook.Name);
16              Console.WriteLine(outBook.Price);
17  
18              Console.Read();
19          }
20      }
21  
22      public class Serializer
23      {
24          /// 将对象序列化为json文件
25          /// </summary>
26          /// <typeparam name="T">类型</typeparam>
27          /// <param name="t">实例</param>
28          /// <param name="path">存放路径</param>
29          public static void ObjectToJson<T>(T t, string path) where T : class
30          {
31              DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
32              using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
33              {
34                  formatter.WriteObject(stream, t);
35              }
36          }
37  
38          /// <summary>
39          /// 将对象序列化为json字符串
40          /// </summary>
41          /// <typeparam name="T">类型</typeparam>
42          /// <param name="t">实例</param>
43          /// <returns>json字符串</returns>
44          public static string ObjectToJson<T>(T t) where T : class
45          {
46              DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(T));
47              using (MemoryStream stream = new MemoryStream())
48              {
49                  formatter.WriteObject(stream, t);
50                  string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
51                  return result;
52              }
53          }
54  
55          /// <summary>
56          /// json字符串转成对象
57          /// </summary>
58          /// <typeparam name="T">类型</typeparam>
59          /// <param name="json">json格式字符串</param>
60          /// <returns>对象</returns>
61          public static T JsonToObject<T>(string json) where T : class
62          {
63              DataContractJsonSerializer formatter = new DataContractJsonSerializer(typeof(Book));
64              using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json)))
65              {
66                  T result = formatter.ReadObject(stream) as T;
67                  return result;
68              }
69          }                  
70      }
复制代码

二、序列化为xml

C#中将对象序列化和反序列化为xml的类是XmlSerializer,要引用System.Xml.Serialization
先创建一个XmlSerializer对象实例,然后用实例的Serialize的方法将对象写入到文件流中,代码如下:
复制代码
 1      class Program
 2      {
 3          static void Main(string[] args)
 4          {
 5              Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };
 6  
 7              XmlSerializer formatter = new XmlSerializer(typeof(Book));
 8              using (FileStream stream = new FileStream(@"c:\book.xml", FileMode.OpenOrCreate))
 9              {
10                  formatter.Serialize(stream, book);
11              }
12              Console.Read();
13          }
14      }
复制代码
程序运行后会在c盘产生一个book.xml文件,内容如下:


当然也可以将对象转换成对象流,然后转换成xml格式的字符串,代码和效果图如下:
复制代码
 1      class Program
 2      {
 3          static void Main(string[] args)
 4          {
 5              Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };
 6  
 7              XmlSerializer formatter = new XmlSerializer(typeof(Book));
 8              using (MemoryStream stream = new MemoryStream())
 9              {
10                  formatter.Serialize(stream, book);
11                  string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());//转换成xml字符串
12                  Console.WriteLine(result);
13              }
14              Console.Read();
15          }
16      }
复制代码

将xml文件反序列化的方法是用XmlSerializer实例的Deserialize()方法,代码如下:
复制代码
 1      class Program
 2      {
 3          static void Main(string[] args)
 4          {
 5              Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };
 6  
 7              XmlSerializer formatter = new XmlSerializer(typeof(Book));
 8              using (FileStream stream = new FileStream(@"c:book.xml", FileMode.OpenOrCreate))
 9              {
10                  XmlReader xmlReader = new XmlTextReader(stream);
11                  Book outBook = formatter.Deserialize(xmlReader) as Book;//反序列化
12                  Console.WriteLine(outBook.ID);
13                  Console.WriteLine(outBook.Name);
14                  Console.WriteLine(outBook.Price);
15              }
16              Console.Read(); 
17          }
18      }
复制代码

程序执行完成效果如图:

我们同样也可以把上面的xml序列化与反序列为封装成泛型方法,这样可以公用,全部代码如下:
复制代码
 1      class Program
 2      {
 3          static void Main(string[] args)
 4          {
 5              Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };
 6              
 7              //序列化xml
 8              Serializer.ObjectToXml(book, @"c:\book.xml");
 9  
10              //反序列化xml
11              Book outBook = Serializer.XmlToObject(book, @"c:\book.xml");
12              Console.WriteLine(outBook.ID);
13              Console.WriteLine(outBook.Name);
14              Console.WriteLine(outBook.Price);
15              Console.Read();
16          }
17      }
18  
19      public class Serializer
20      {     
21          /// <summary>
22          /// 将对象序列化为xml文件
23          /// </summary>
24          /// <typeparam name="T">类型</typeparam>
25          /// <param name="t">对象</param>
26          /// <param name="path">xml存放路径</param>
27          public static void ObjectToXml<T>(T t,string path) where T : class
28          {
29              XmlSerializer formatter = new XmlSerializer(typeof(T));
30              using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
31              {
32                  formatter.Serialize(stream, t);
33              }
34          }
35  
36          /// <summary>
37          /// 将对象序列化为xml字符串
38          /// </summary>
39          /// <typeparam name="T">类型</typeparam>
40          /// <param name="t">对象</param>
41          public static string ObjectToXml<T>(T t) where T : class
42          {
43              XmlSerializer formatter = new XmlSerializer(typeof(T));
44              using (MemoryStream stream = new MemoryStream())
45              {
46                  formatter.Serialize(stream, t);
47                  string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
48                  return result;
49              }
50          }
51  
52          /// <summary>
53          /// 将xml文件反序列化为对象
54          /// </summary>
55          /// <typeparam name="T">类型</typeparam>
56          /// <param name="t">对象</param>
57          /// <param name="path">xml路径</param>
58          /// <returns>对象</returns>
59          public static T XmlToObject<T>(T t, string path) where T : class
60          {
61              XmlSerializer formatter = new XmlSerializer(typeof(T));
62              using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
63              {
64                  XmlReader xmlReader = new XmlTextReader(stream);
65                  T result = formatter.Deserialize(xmlReader) as T;
66                  return result;
67              }
68          }       
69      }
复制代码

三、序列化为文件

C#中将对象序列化和反序列化为二进制文件的类是BinaryFormatter,要引用System.Runtime.Serialization.Formatters.Binary
先创建一个BinaryFormatter对象实例,然后用实例的Serialize的方法将对象写入到文件流中,代码如下:
复制代码
 1      class Program
 2      {
 3          static void Main(string[] args)
 4          {
 5              Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };
 6  
 7              //序列化文件
 8              BinaryFormatter formatter = new BinaryFormatter();
 9              using (FileStream stream = new FileStream(@"c:\book.txt", FileMode.OpenOrCreate))
10              {
11                  formatter.Serialize(stream, book);
12              }
13              Console.Read();
14          }
15      }
复制代码
程序执行完成后产生bool.txt文件,如图:

可以通过BinaryFormatter类型实例的Deserialize()方法把二进制文本反序列化为对象,代码如下:
复制代码
 1      class Program
 2      {
 3          static void Main(string[] args)
 4          {
 5              Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };
 6  
 7              //序列化文件
 8              BinaryFormatter formatter = new BinaryFormatter();
 9              using (FileStream stream = new FileStream(@"c:\book.txt", FileMode.OpenOrCreate))
10              {
11                  Book outBook = formatter.Deserialize(stream) as Book;
12                  Console.WriteLine(outBook.ID);
13                  Console.WriteLine(outBook.Name);
14                  Console.WriteLine(outBook.Price);
15              }
16              Console.Read();
17          }
18      }
复制代码
程序执行后显示如图:

我们同样也可以把序列化和把序列化为二进制文件的方法封装成泛型方法,全部代码如下:

复制代码
 1      class Program
 2      {
 3          static void Main(string[] args)
 4          {
 5              Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f };
 6              //序列化文件
 7              Serializer.ObjectToFile(book, @"c:\book.txt");
 8  
 9              //反序列化文件
10              Book outBook = Serializer.FileToObject<Book>(@"c:\book.txt") as Book;
11              Console.WriteLine(outBook.ID);
12              Console.WriteLine(outBook.Name);
13              Console.WriteLine(outBook.Price);
14              Console.Read();
15          }
16      }
17  
18      public class Serializer
19      {
20          #region 文件序列化
21          /// <summary>
22          /// 将对象序列化为字符串
23          /// </summary>
24          /// <typeparam name="T">类型</typeparam>
25          /// <param name="t">实例</param>
26          /// <returns>字符串</returns>
27          public static string ObjectToString<T>(T t)
28          {
29              BinaryFormatter formatter = new BinaryFormatter();
30              using (MemoryStream stream = new MemoryStream())
31              {                
32                  formatter.Serialize(stream, t);
33                  string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
34                  return result;
35              }
36          }
37  
38          /// <summary>
39          /// 将对象序列化为文件
40          /// </summary>
41          /// <typeparam name="T">类型</typeparam>
42          /// <param name="t">实例</param>
43          /// <param name="path">存放路径</param>
44          public static void ObjectToFile<T>(T t, string path)
45          {
46              BinaryFormatter formatter = new BinaryFormatter();
47              using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
48              {                
49                  formatter.Serialize(stream, t);
50                  stream.Flush();
51              }
52          }
53  
54          /// <summary>
55          /// 将字符串反序列为类型
56          /// </summary>
57          /// <typeparam name="T">类型</typeparam>
58          /// <param name="s">字符串</param>
59          /// <returns>对象</returns>
60          public static T StringToObject<T>(string s) where T : class
61          {
62              byte[] buffer = System.Text.Encoding.UTF8.GetBytes(s);
63              BinaryFormatter formatter = new BinaryFormatter();
64              using (MemoryStream stream = new MemoryStream(buffer))
65              {                
66                  T result = formatter.Deserialize(stream) as T;
67                  return result;
68              }
69          }
70  
71          /// <summary>
72          /// 将文件反序列化为对象
73          /// </summary>
74          /// <typeparam name="T">类型</typeparam>
75          /// <param name="path">路径</param>
76          /// <returns>对象</returns>
77          public static T FileToObject<T>(string path) where T : class
78          {
79              using (FileStream stream = new FileStream(path, FileMode.Open))
80              {
81                  BinaryFormatter formatter = new BinaryFormatter();
82                  T result = formatter.Deserialize(stream) as T;
83                  return result;
84              }
85          }
86          #endregion
87      }
88  
89      [Serializable]
90      public class Book
91      {
92          public int ID { get; set; }
93          public string Name { get; set; }
94          public float Price { get; set; }
95      }
复制代码

 

 

 
摘要: 写两点自己对软件设计的感悟,没有参考任何网上资料,也不会设计模式,只是总结自己对软件的理解,写的不好,还望大家包涵。1、模块化设计无论一个项目有多大,在进行前期规划前,首要的工作就是按业务需求进行模块分割,让其分成一个个业务单元,这些业务单元块如果没有业务联系的话,每个单元之间相对其他单元应该是封闭不公开的,像黑盒子一样,这样在软件开发的时候,进行分组开发,一个小组开发一个模块,黑盒子中的业务逻辑只跟当前黑盒子相关。从整体上说,每个模块只留一个口子和其他模块进行交流,比如图书管理模块中的接口任务就是按照外部的需要返回对应的图书信息即可。这样独立的模块可做到易维护、易扩展、易移植。2、避免过渡设阅读全文
posted @ 2014-03-27 14:58 黑树 阅读(19) | 评论 (0) 编辑
 
摘要: 做公司项目时,要求写一个方法,方法的参数为一个菜单数组集合和一个菜单id,菜单数组的格式为树状json,如下面所示:[{"id":28,"text":"公司信息","children":[{"id":1,"text":"公司文化"},{"id":2,"text":"招聘计划"},{"id":6,"text":"公司新闻","ch阅读全文
posted @ 2014-03-19 09:06 黑树 阅读(23) | 评论 (0) 编辑
摘要: 在做mvc项目时,当使用xheditor、ueditor编辑器时,点击提交时,编辑器中的内容会带有html标签提交给服务器,这时就是会报错,出现如下内容:“/”应用程序中的服务器错误。从客户端(Details="高级abs高级abs高级a...")中检测到有潜在危险的 Request.Form 值。这里可以在目标方法上加上忽略输出的属性,即可解决 [ValidateInput(false)] public ActionResult Dealproducts(ProductsModels model) { products.Updat...阅读全文


 
 
分类: C#
posted on 2014-04-18 09:16  HackerVirus  阅读(426)  评论(0)    收藏  举报