C#序列化和反序列化

2025-11-05 18:44:10

1、启动VS,新建C# 类库项目,并命名为KTools。

C#序列化和反序列化

2、添加C# Winform项目,命名为Test,重命名主窗口为MainForm,并设置为启动项。同时在KTools项目添加文件夹Serializer,并在该文件夹中添加3个类:XMLSerializer、SoapSerializer和BinarySerializer,如下图:

C#序列化和反序列化

3、该类库的设计目标是快速方便,最好把序列化和反序列化的方法做成静态方法,这样就可以省去了实例化的步骤。序列化大体上分为序列化到文件和序列化到流,虽然序列化到流更为通用,但序列化到流的步骤中似乎没有什么可简化的,故我们只讨论序列化到文件。对于序列化到文件,我们需要考虑文件是否存在、写入是否覆盖等,为了方便使用只考虑“存在覆盖”的原则。为了尽可能的避免异常(因为这样使用起来更简单,不必考虑是否会引发异常),我们必须确保对象可序列化、文件存在、反序列化时文件不空等。另外,为了避免反序列化时的类型转化,以及更好的使用类,把序列化和范序列化的方法做成泛型。

1、XML序列化需要引用名称空间System.Xml.Serialization,序列化代码如下:

 public static void Serialize<T>(T o, string filePath)

        {

            try

            {

                XmlSerializer formatter = new XmlSerializer(typeof(T));

                StreamWriter sw = new StreamWriter(filePath, false);

                formatter.Serialize(sw, o);

                sw.Flush();

                sw.Close();

            }

            catch (Exception) { }

        }

2、XML反序列化,代码如下:

 public static T DeSerialize<T>(string filePath)

        {

            try

            {

                XmlSerializer formatter = new XmlSerializer(typeof(T));

                StreamReader sr = new StreamReader(filePath);

                T o = (T)formatter.Deserialize(sr);

                sr.Close();

                return o;

            }

            catch (Exception)

            {

            }

            return default(T);

        }

1、Soap序列化需要名称引用空间System.Runtime.Serialization.Formatters.Soap,并且该dll引用需要手工添加。Soap序列化代码,如下:

 public static void Serialize<T>(T o, string filePath)

        {

            try

            {

                SoapFormatter formatter = new SoapFormatter();

               // StreamWriter sw = new StreamWriter(filePath, false);

                Stream stream = new FileStream(filePath , FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);

                formatter.Serialize(stream, o);

                stream.Flush();

                stream.Close();

            }

            catch (Exception) { }

        }

2、Soap反序列化,代码如下:

public static T DeSerialize<T>(string filePath)

        {

            try

            {

                SoapFormatter formatter = new SoapFormatter();

               // StreamReader sr = new StreamReader(filePath);

                Stream destream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);

                T o = (T)formatter.Deserialize(destream);

                destream.Flush();

                destream.Close();

                return o;

            }

            catch (Exception)

            {

            }

            return default(T);

        }

1、Binary序列化,代码:

public static void Serialize<T>(T o, string filePath)

        {

            try

            {

                BinaryFormatter formatter = new BinaryFormatter();

                Stream stream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);

                formatter.Serialize(stream, o);

                stream.Flush();

                stream.Close();

            }

            catch (Exception) { }

        }

2、Binary反序列化,代码:

 public static T DeSerialize<T>(string filePath)

        {

            try

            {

                BinaryFormatter formatter = new BinaryFormatter();

                Stream destream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);

                T o = (T)formatter.Deserialize(destream);

                destream.Flush();

                destream.Close();

                return o;

            }

            catch (Exception)

            {

            }

            return default(T);

        }

1、在Test项目中的MainForm窗体中添加两个Button控件,分别命名为“序列化”和“反序列化”,并添加代码:

  public partial class MainForm : Form

    {

        public MainForm()

        {

            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            string str = "Hello world!!!";

            KTools.Serializer.XMLSerializer.Serialize<string>(str, "1.txt");

            MessageBox.Show("序列化完毕");

        }

        private void button2_Click(object sender, EventArgs e)

        {

            string str = KTools.Serializer.XMLSerializer.DeSerialize<string>("1.txt");

            MessageBox.Show(str);

        }

    }

C#序列化和反序列化

2、调试运行,查看结果:

C#序列化和反序列化

C#序列化和反序列化

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢