C#实现对象的序列化(简单工厂模式实现)

 

本例采用简单工厂模式方法实现对象的序列化,现已实现的三种方法为:Xml,Soap和Binary三种方式,具体实现方法如下:

序列化基类代码如下:

 1 public class XSerializeTool
 2     {
 3         /// <summary>
 4         /// 序列化方法
 5         /// </summary>
 6         /// <param name="fileName">序列话文件</param>
 7         public void Serialize(string fileName, object obj, Type type = null)
 8         {
 9             using (FileStream fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write))
10             {
11                 this.Serialize(fileStream, obj, type);
12             }
13         }
14 
15         /// <summary>
16         /// 序列化操作
17         /// </summary>
18         /// <param name="fileStream"></param>
19         /// <param name="obj"></param>
20         /// <param name="type"></param>
21         protected virtual void Serialize(FileStream fileStream, object obj, Type type = null)
22         {
23 
24         }
25 
26         /// <summary>
27         /// 反序列化方法
28         /// </summary>
29         /// <param name="fileName"></param>
30         /// <returns></returns>
31         public object DeSerialize(string fileName, Type type = null)
32         {
33             using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
34             {
35                 return this.DeSerialize(fileStream, type);
36             }
37         }
38 
39         /// <summary>
40         /// 反序列化操作
41         /// </summary>
42         /// <param name="fileStream"></param>
43         /// <returns></returns>
44         protected virtual object DeSerialize(FileStream fileStream, Type type = null)
45         {
46             return null;
47         }
48     }

Xml序列化实现代码如下:

 1 public partial class XmlSerializeTool : XSerializeTool
 2     {
 3         protected override void Serialize(FileStream fileStream, object obj, Type type = null)
 4         {
 5             if (type == null)
 6             {
 7                 throw new Exception("未指定要序列化的类型!");
 8             }
 9             XmlSerializer serializer = new XmlSerializer(type);
10             serializer.Serialize(fileStream, obj);
11         }
12 
13         protected override object DeSerialize(FileStream fileStream, Type type = null)
14         {
15             if (type == null)
16             {
17                 throw new Exception("未指定要序列化的类型!");
18             }
19             XmlSerializer serializer = new XmlSerializer(type);
20             return serializer.Deserialize(fileStream);
21         }
22     }

Soap序列化代码如下:

 1 public partial class XSoapSerializeTool : XSerializeTool
 2     {
 3 
 4         protected override void Serialize(FileStream fileStream, object obj, Type type = null)
 5         {
 6             SoapFormatter formater = new SoapFormatter();
 7             formater.Serialize(fileStream, obj);
 8         }
 9 
10         protected override object DeSerialize(FileStream fileStream, Type type = null)
11         {
12             SoapFormatter formater = new SoapFormatter();
13             return formater.Deserialize(fileStream);
14         }
15     }

实现序列化实例化的简单工厂方法类代码如下:

 1  public partial class XSerializeContext
 2     {
 3         public static XSerializeTool CreateInstance(XSerializeType serializeType)
 4         {
 5             switch (serializeType)
 6             {
 7                 case XSerializeType.Xml:
 8                     return new XmlSerializeTool();
 9                 case XSerializeType.Binary:
10                     return new XBinarySerializeTool();
11                 case XSerializeType.Soap:
12                     return new XSoapSerializeTool();
13                 default:
14                     return null;
15             }
16         }
17     }

序列化类型的枚举定义如下:

1 public enum XSerializeType
2     {
3         Xml = 0,
4         Binary = 2,
5         Soap = 3
6     }

具体调用方法如下:
要序列话的类定义如下:

 1 [Serializable]
 2     public partial class MyObject
 3     {
 4         private string m_UserName = string.Empty;
 5 
 6         public string UserName
 7         {
 8             get { return m_UserName; }
 9             set { m_UserName = value; }
10         }
11 
12         private string m_Address = string.Empty;
13 
14         public string Address
15         {
16             get { return this.m_Address; }
17             set { this.m_Address = value; }
18         }
19 
20         public override string ToString()
21         {
22             return string.Format("用户名:{0},地址:{1}", m_UserName, m_Address);
23         }
24     }

序列化客户端调用代码如下:

 1   static void Main(string[] args)
 2         {
 3             MyObject myObject = new MyObject();
 4             myObject.UserName = "Wss";
 5             myObject.Address = "天津市";
 6 
 7             XSerializeTool tool = XSerializeContext.CreateInstance(XSerializeType.Xml);
 8             string fileName = "C:\\Test.xml";
 9             tool.Serialize(fileName, myObject, typeof(MyObject));
10             MyObject myOjb = (MyObject)tool.DeSerialize(fileName, typeof(MyObject));
11 
12             fileName = "C:\\Test.dat";
13             tool = XSerializeContext.CreateInstance(XSerializeType.Binary);
14             tool.Serialize(fileName, myObject);
15             myOjb = (MyObject)tool.DeSerialize(fileName, typeof(MyObject));
16 
17             fileName = "C:\\Test.soap";
18             tool = XSerializeContext.CreateInstance(XSerializeType.Soap);
19             tool.Serialize(fileName, myObject);
20             myOjb = (MyObject)tool.DeSerialize(fileName, typeof(MyObject));
21         }

 

 

posted on 2012-05-06 12:45  武子  阅读(1698)  评论(1)    收藏  举报

导航