zoukankan      html  css  js  c++  java
  • C#学习——序列化和反序列化练习的重构

    目的

           代码的重构!我上一次写的随笔“C#学习——序列化和反序列化”对接口的理解似乎有误,接口基本上没进行什么设计,之后虽然也重新设计了一下,

    但是写了两个接口IDeserialize和ISerialize每个接口里面只有一方法,分别为反序列化和序列化,有点感觉过度设计,所以现在写了一篇

    C#学习——序列化和反序列化练习的重构,来改正这一错误,这一例子觉得有一些地方写的不妥,希望大家觉得哪里不顺眼,踊跃发言哈!

     

    示例:

     

           1、新建解决方案Serializer

     

          2、新建类库Jack.Gao.Domain,并在该类库下添加Person类,Person类的代码如下:

     

    View Code
     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。代码如下:

     

    View Code
     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,代码如下:

     

    View Code
     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,用于根据类型生成某一特点的序列化方式。不过这里写的代码感觉不想面向对象的,写的有点烂。添加如下代码:

     

    View Code
     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:

    View Code
     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:

    View Code
     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:

    View Code
     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:

    View Code
     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:

    View Code
     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添加如下代码:

     

    View Code
     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序列化后生成的,你也可以查看其它的两种方式生成的内容。

     

     

              

     

  • 相关阅读:
    创建类以及引用一个类
    修改hosts文件
    微信第三方登录接口开发
    Android定位
    Leetcode 102. Binary Tree Level Order Traversal
    Leetcode 725. Split Linked List in Parts
    Leetcode 445. Add Two Numbers II
    Leetcode 328. Odd Even Linked List
    Leetcode 237. Delete Node in a Linked List
    Leetcode 234. Palindrome Linked List
  • 原文地址:https://www.cnblogs.com/GaoHuhu/p/2621708.html
Copyright © 2011-2022 走看看