C#序列化和反序列化

开发 后端
本文通过一个小例子介绍了C#序列化和反序列化的主要方法,希望对大家有所帮助。

.net下有一种技术叫做对象序列化,说得通俗一点,C#序列化就是把一个对象保存到一个文件或数据库字段中去,C#反序列化就是在需要的时候再把这个文件转化成原来的对象使用。

在.NET中常见的C#序列化的方法主要也有三个:二进制序列化、XML序列化、SOAP序列化。

下面通过一个小例子来说明这三种方法的使用。

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;   
  4. namespace FileSerializer  
  5. {  
  6.     [Serializable]  
  7.     public class Book  
  8.     {        
  9.         string id;  
  10.         string name;  
  11.  
  12.         public string Id  
  13.         {  
  14.             get { return id; }  
  15.             set { id = value; }  
  16.         }  
  17.  
  18.         public string Name  
  19.         {  
  20.             get { return name; }  
  21.             set { name = value; }  
  22.         }  
  23.           
  24.         public Book()  
  25.         {  
  26.         }  
  27.  
  28.         public Book(string id,string name)  
  29.         {  
  30.             this.id = id;  
  31.             this.name = name;  
  32.         }  
  33.  
  34.         public override string ToString()  
  35.         {  
  36.             return "编号:" + id + "\t名称:" + name;  
  37.         }  
  38.     }  
  39. }  
  40.  
  41. using System;  
  42. using System.Collections.Generic;  
  43. using System.Text;  
  44. using System.IO;  
  45. using System.Xml.Serialization;  
  46.  
  47. namespace FileSerializer  
  48. {  
  49.     public abstract class Serializer< T>  
  50.     {  
  51.         string filePath;  
  52.  
  53.         public string FilePath  
  54.         {  
  55.             get { return filePath; }  
  56.             set { filePath = value; }  
  57.         }  
  58.  
  59.         public Serializer(string filePath)  
  60.         {  
  61.             this.filePath = filePath;  
  62.         }  
  63.  
  64.         public void Serialize(T serializeObj)  
  65.         {  
  66.             using (Stream st = new FileStream(filePath, FileMode.Create, FileAccess.Write))  
  67.             {  
  68.                 S(st, serializeObj);  
  69.             }  
  70.         }  
  71.  
  72.         protected abstract void S(Stream st, T serializeObj);  
  73.  
  74.         public T Deserialize()  
  75.         {  
  76.             using (Stream st = new FileStream(filePath, FileMode.Open, FileAccess.Read))  
  77.             {  
  78.                 return D(st);  
  79.             }  
  80.         }  
  81.  
  82.         protected abstract T D(Stream st);  
  83.     }  
  84. }  
  85.  
  86. using System;  
  87. using System.Collections.Generic;  
  88. using System.Text;  
  89. using System.IO;  
  90. using System.Runtime.Serialization.Formatters.Binary;  
  91.  
  92. namespace FileSerializer  
  93. {  
  94.     class SerializerBinary< T> : Serializer< T>  
  95.     {  
  96.         public SerializerBinary(string filePath)  
  97.             : base(filePath)  
  98.         {  
  99.         }  
  100.         protected override void S(Stream st, T serializeObj)  
  101.         {  
  102.             BinaryFormatter bf = new BinaryFormatter();  
  103.             bf.Serialize(st, serializeObj);  
  104.         }  
  105.  
  106.         protected override T D(Stream st)  
  107.         {  
  108.             BinaryFormatter bf = new BinaryFormatter();  
  109.             return (T)bf.Deserialize(st);  
  110.         }  
  111.     }  
  112. }  
  113.  
  114. using System;  
  115. using System.Collections.Generic;  
  116. using System.Text;  
  117. using System.IO;  
  118. using System.Runtime.Serialization.Formatters.Soap;  
  119.  
  120. namespace FileSerializer  
  121. {  
  122.     public class SerializerSoap< T> : Serializer< T>  
  123.     {  
  124.         public SerializerSoap(string filePath)  
  125.             : base(filePath)  
  126.         {  
  127.         }  
  128.  
  129.         protected override void S(Stream st, T serializeObj)  
  130.         {  
  131.             SoapFormatter sf = new SoapFormatter();  
  132.             sf.Serialize(st, serializeObj);  
  133.         }  
  134.  
  135.         protected override T D(Stream st)  
  136.         {  
  137.             SoapFormatter sf = new SoapFormatter();  
  138.             return (T)sf.Deserialize(st);  
  139.         }  
  140.     }  
  141. }  
  142.  
  143.  
  144. using System;  
  145. using System.Collections.Generic;  
  146. using System.Text;  
  147. using System.Xml.Serialization;  
  148. using System.IO;  
  149.  
  150. namespace FileSerializer  
  151. {  
  152.     public class SerializerXml< T> : Serializer< T>  
  153.     {  
  154.         public SerializerXml(string filePath)  
  155.             : base(filePath)  
  156.         {  
  157.         }  
  158.  
  159.         protected override void S(Stream st, T serializeObj)  
  160.         {  
  161.             XmlSerializer xs = new XmlSerializer(typeof(T));  
  162.             xs.Serialize(st, serializeObj);  
  163.         }  
  164.  
  165.         protected override T D(Stream st)  
  166.         {  
  167.             XmlSerializer xs = new XmlSerializer(typeof(T));  
  168.             return (T)xs.Deserialize(st);  
  169.         }  
  170.     }  
  171. }  
  172.  
  173.  
  174. using System;  
  175. using System.Collections.Generic;  
  176. using System.Text;  
  177.  
  178. namespace FileSerializer  
  179. {  
  180.     class Program  
  181.     {  
  182.         static void Main(string[] args)  
  183.         {  
  184.             Book book = new Book("01","C#程序设计入门01");  
  185.             Serializer< Book> serializer = new SerializerBinary< Book>("bookBinary");  
  186.             serializer.Serialize(book);  
  187.  
  188.             Book newbook = serializer.Deserialize();  
  189.             Console.WriteLine(newbook.ToString());  
  190.      
  191.             book = new Book("02""C#程序设计入门02");  
  192.             serializer = new SerializerSoap< Book>("bookSoap.soap");  
  193.             serializer.Serialize(book);  
  194.  
  195.             newbook = serializer.Deserialize();  
  196.             Console.WriteLine(newbook.ToString());  
  197.  
  198.             book = new Book("03""C#程序设计入门03");  
  199.             serializer = new SerializerXml< Book>("bookXml.xml");  
  200.             serializer.Serialize(book);  
  201.  
  202.             newbook = serializer.Deserialize();  
  203.             Console.WriteLine(newbook.ToString());  
  204.             Console.ReadLine();  
  205.         }  
  206.     }  

C#序列化和反序列化的例子就和大家讨论到这里。

【编辑推荐】

  1. C#控制台应用程序的基本结构
  2. C#编程:使用迭代器
  3. 浅谈C#泛型的定义、继承、方法和约束
  4. C++和C#相互调用COM组件的方法简介
  5. 如何实现C#代理(Delegate)
责任编辑:book05 来源: IT168
相关推荐

2009-08-06 11:16:25

C#序列化和反序列化

2009-08-25 14:24:36

C#序列化和反序列化

2009-08-25 14:43:26

C#序列化和反序列化

2011-06-01 14:50:48

2022-08-06 08:41:18

序列化反序列化Hessian

2011-06-01 15:05:02

序列化反序列化

2011-05-18 15:20:13

XML

2019-11-20 10:07:23

web安全PHP序列化反序列化

2009-06-14 22:01:27

Java对象序列化反序列化

2024-01-30 13:32:51

JSON反序列化序列化

2024-03-05 12:49:30

序列化反序列化C#

2018-03-19 10:20:23

Java序列化反序列化

2023-12-13 13:49:52

Python序列化模块

2009-09-09 16:10:11

.NET序列化和反序列

2021-11-18 07:39:41

Json 序列化Vue

2010-03-19 15:54:21

Java Socket

2009-07-29 13:39:02

JSON序列化和反序列ASP.NET AJA

2009-09-09 15:47:27

XML序列化和反序列化

2009-09-09 14:45:41

XML序列化和反序列化

2012-04-13 10:45:59

XML
点赞
收藏

51CTO技术栈公众号