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 }
浙公网安备 33010602011771号