目的:
代码的重构!我上一次写的随笔“C#学习——序列化和反序列化”对接口的理解似乎有误,接口基本上没进行什么设计,之后虽然也重新设计了一下,
但是写了两个接口IDeserialize和ISerialize每个接口里面只有一方法,分别为反序列化和序列化,有点感觉过度设计,所以现在写了一篇
C#学习——序列化和反序列化练习的重构,来改正这一错误,这一例子觉得有一些地方写的不妥,希望大家觉得哪里不顺眼,踊跃发言哈!
示例:
1、新建解决方案Serializer
2、新建类库Jack.Gao.Domain,并在该类库下添加Person类,Person类的代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Runtime.Serialization.Formatters; 6 7 namespace Jack.Gao.Domain 8 { 9 [Serializable] 10 public class Person 11 { 12 //如果不想实例化某一个字段,可以使用特性NonSerialized标记 13 private int _id; 14 public int Id 15 { 16 get { return _id; } 17 set { _id = value; } 18 } 19 20 private string _name; 21 public string Name 22 { 23 get { return _name; } 24 set { _name = value; } 25 } 26 27 private string _sex; 28 public string Sex 29 { 30 get { return _sex; } 31 set { _sex = value; } 32 } 33 } 34 }
3、新建类库Jack.Gao.PersonFactory,在该库下新建Factory类,用于生成Person。代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using Jack.Gao.Domain; 7 8 namespace Jack.Gao.PersonFactory 9 { 10 public class Factory 11 { 12 #region Create Person 13 public static Person CreatePerson() 14 { 15 return new Person(); 16 } 17 #endregion 18 } 19 }
添加枚举类型SerializerType,代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Jack.Gao.PersonFactory 7 { 8 public enum SerializerType 9 { 10 Xml, 11 Binary, 12 Soap 13 } 14 }
再新建一个类SerializerTypeFactory,用于根据类型生成某一特点的序列化方式。不过这里写的代码感觉不想面向对象的,写的有点烂。添加如下代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO; 6 using System.Runtime.Serialization.Formatters.Binary; 7 using System.Xml.Serialization; 8 using System.Diagnostics; 9 using System.Runtime.Serialization.Formatters.Soap; 10 using Jack.Gao.Domain; 11 12 namespace Jack.Gao.PersonFactory 13 { 14 public static class SerializerTypeFactory 15 { 16 public static object CreateSerializerType(SerializerType serializerType) 17 { 18 object serializer=null; 19 20 switch (serializerType) 21 { 22 case SerializerType.Xml: 23 serializer = new XmlSerializer(typeof(Person)); 24 break; 25 case SerializerType.Binary: 26 serializer = new BinaryFormatter(); 27 break; 28 case SerializerType.Soap: 29 serializer = new SoapFormatter(); 30 break; 31 default: 32 throw new Exception("Type is not correctly!"); 33 } 34 35 return serializer; 36 } 37 } 38 }
4、新建类库Jack.Gao.Persistence,新建
ISerialize接口、SerializeBase抽象类、BinarySerializePerson、SoapSerializePerson、XmlSerializePerson这三个类分别实现了ISerialize接口。代码如下:
SerializeBase:
1 using System.IO; 2 using Jack.Gao.Domain; 3 using Jack.Gao.PersonFactory; 4 5 namespace Jack.Gao.Persistence.Base 6 { 7 public abstract class SerializeBase 8 { 9 protected Person PersonBase { get; set; } 10 11 protected virtual FileStream FileStreamBase { get; set; } 12 13 public SerializeBase() 14 { 15 PersonBase = Factory.CreatePerson(); 16 } 17 18 //public virtual void SerializePerson() 19 //{ 20 21 //} 22 23 //public virtual Person DeSerializePerson() 24 //{ 25 // return new Person(); 26 //} 27 } 28 }
ISerialize:
1 using Jack.Gao.Domain; 2 3 namespace Jack.Gao.Persistence.Interface 4 { 5 interface ISerialize 6 { 7 void SerializePerson(); 8 Person DeSerializePerson(); 9 } 10 }
BinarySerializePerson:
1 using System.IO; 2 using System.Runtime.Serialization.Formatters.Binary; 3 using Jack.Gao.Domain; 4 using Jack.Gao.Persistence.Base; 5 using Jack.Gao.Persistence.Interface; 6 using Jack.Gao.PersonFactory; 7 8 namespace Jack.Gao.Persistence.Implement 9 { 10 public class BinarySerializePerson : SerializeBase,ISerialize 11 { 12 public void SerializePerson() 13 { 14 PersonBase.Id = 2; 15 PersonBase.Name = "Jim"; 16 PersonBase.Sex = "Man"; 17 18 using (FileStreamBase = new FileStream("Person.txt", FileMode.Create)) 19 { 20 BinaryFormatter binaryFormatter = (BinaryFormatter)SerializerTypeFactory.CreateSerializerType 21 (SerializerType.Binary); 22 binaryFormatter.Serialize(FileStreamBase, PersonBase); 23 } 24 } 25 26 public Person DeSerializePerson() 27 { 28 using (FileStreamBase = new FileStream("Person.txt", FileMode.Open)) 29 { 30 BinaryFormatter binaryFormatter = 31 (BinaryFormatter)SerializerTypeFactory.CreateSerializerType(SerializerType.Binary); 32 PersonBase = (Person)binaryFormatter.Deserialize(FileStreamBase); 33 } 34 35 return PersonBase; 36 } 37 } 38 }
SoapSerializePerson:
1 using System.IO; 2 using System.Runtime.Serialization.Formatters.Soap; 3 using Jack.Gao.Domain; 4 using Jack.Gao.Persistence.Base; 5 using Jack.Gao.Persistence.Interface; 6 using Jack.Gao.PersonFactory; 7 8 namespace Jack.Gao.Persistence.Implement 9 { 10 public class SoapSerializePerson : SerializeBase,ISerialize 11 { 12 public void SerializePerson() 13 { 14 PersonBase.Id = 3; 15 PersonBase.Name = "Green"; 16 PersonBase.Sex = "Woman"; 17 18 using (FileStreamBase = new FileStream("Person.xml", FileMode.Create)) 19 { 20 SoapFormatter soapFormatter = (SoapFormatter)SerializerTypeFactory. 21 CreateSerializerType(SerializerType.Soap); 22 soapFormatter.Serialize(FileStreamBase, PersonBase); 23 } 24 } 25 26 public Person DeSerializePerson() 27 { 28 using (FileStreamBase = new FileStream("Person.xml", FileMode.Open)) 29 { 30 SoapFormatter soapFormatter = (SoapFormatter)SerializerTypeFactory. 31 CreateSerializerType(SerializerType.Soap); 32 PersonBase = (Person)soapFormatter.Deserialize(FileStreamBase); 33 } 34 35 return PersonBase; 36 } 37 } 38 }
XmlSerializePerson:
1 using System.IO; 2 using System.Xml.Serialization; 3 using Jack.Gao.Domain; 4 using Jack.Gao.Persistence.Base; 5 using Jack.Gao.Persistence.Interface; 6 using Jack.Gao.PersonFactory; 7 8 namespace Jack.Gao.Persistence.Implement 9 { 10 public class XmlSerializePerson : SerializeBase,ISerialize 11 { 12 public void SerializePerson() 13 { 14 using (FileStreamBase= new FileStream("Person.xml", FileMode.Create)) 15 { 16 PersonBase.Id = 1; 17 PersonBase.Name = "Jack Gao"; 18 PersonBase.Sex = "Man"; 19 20 XmlSerializer xmlSerializer = (XmlSerializer)SerializerTypeFactory. 21 CreateSerializerType(SerializerType.Xml); 22 xmlSerializer.Serialize(FileStreamBase, PersonBase); 23 } 24 } 25 26 public Person DeSerializePerson() 27 { 28 using (FileStreamBase = new FileStream("Person.xml", FileMode.Open)) 29 { 30 XmlSerializer xmlSerializer = (XmlSerializer)SerializerTypeFactory. 31 CreateSerializerType(SerializerType.Xml); 32 PersonBase = (Person)xmlSerializer.Deserialize(FileStreamBase); 33 } 34 35 return PersonBase; 36 } 37 } 38 }
5、新建控制台输出程序Jack.Gao.AppSerializer,在Program.cs添加如下代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO; 6 using System.Diagnostics; 7 8 using Jack.Gao.Domain; 9 using Jack.Gao.Persistence; 10 using Jack.Gao.Persistence.Implement; 11 12 namespace Jack.Gao.AppSerializer 13 { 14 class Program 15 { 16 private static Person _person=null; 17 18 static void Main(string[] args) 19 { 20 //XmlSerializePerson xmlSerializePerson = new XmlSerializePerson(); 21 //xmlSerializePerson.SerializePerson(); 22 //ShowIsSuccess(); 23 24 //_person = xmlSerializePerson.DeSerializePerson(); 25 //Console.WriteLine(_person.Id); 26 //Console.WriteLine(_person.Name); 27 //Console.WriteLine(_person.Sex); 28 29 BinarySerializePerson binarySerializePerson = new BinarySerializePerson(); 30 binarySerializePerson.SerializePerson(); 31 ShowIsSuccess(); 32 33 _person = binarySerializePerson.DeSerializePerson(); 34 Console.WriteLine(_person.Id); 35 Console.WriteLine(_person.Name); 36 Console.WriteLine(_person.Sex); 37 38 //SoapSerializePerson soapSerializePerson = new SoapSerializePerson(); 39 //soapSerializePerson.SerializePerson(); 40 //ShowIsSuccess(); 41 42 //_person = soapSerializePerson.DeSerializePerson(); 43 //Console.WriteLine(_person.Id); 44 //Console.WriteLine(_person.Name); 45 //Console.WriteLine(_person.Sex); 46 47 Console.ReadKey(); 48 } 49 50 private static void ShowIsSuccess() 51 { 52 if (IsExitFile()) 53 { 54 Console.WriteLine("Create File sucessfull."); 55 } 56 else 57 { 58 Console.WriteLine("Create File error."); 59 } 60 } 61 62 private static bool IsExitFile() 63 { 64 bool exitXmlFile = false; 65 66 string currentApplicationPath = Process.GetCurrentProcess().MainModule.FileName; 67 68 if (!string.IsNullOrEmpty(currentApplicationPath)) 69 { 70 exitXmlFile = true; 71 } 72 73 return exitXmlFile; 74 } 75 } 76 }
运行该程序,可以看到在输出目录下多了一个Person.xml的文件,可以查看里面的内容,以下内容使用soap序列化后生成的,你也可以查看其它的两种方式生成的内容。