序列化与反序列化

来源:互联网 发布:js继承的几种方式比较 编辑:程序博客网 时间:2024/06/11 05:48

序列化和反序列化是为了保存程序相关方面的信息和进行的操作。

按照权威的定义,序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。

参考资料:
http://www.cnblogs.com/qqflying/archive/2008/01/13/1037262.html

1.       一些注意事项

1)       可以使用[Serializable]属性将类标志为可序列化的;

2)       如果某个类的元素不想被序列化

①   可以使用[NonSerialized]属性来标志,

②   可以使用[XmlIgnore]来标志

2.       序列化与反序列化的应用

1)       定义一个类(DatagridViewElementXML.cs),用来装将用于序列化的内容

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Xml.Serialization;

using SignalEditor.SingnalAssembly;

namespace SignalEditor

{

    [XmlInclude(typeof(ConstSignal))]

    [XmlInclude(typeof(ExponentialSignal))]

    [XmlInclude(typeof(RampSignal))]

    [XmlInclude(typeof(RampSlopeSignal))]

    [XmlInclude(typeof(SawtoothSignal))]

    [XmlInclude(typeof(SineSignal))]

    [XmlInclude(typeof(SquareSignal))]

    [XmlInclude(typeof(StepSignal))]

    [XmlInclude(typeof(TriangularSignal))]

    public class SingalRow

    {

        intperiodRow;

        public int PeriodRow

        {

            get{ return periodRow; }

            set{ periodRow = value; }

        }

        List<SignalGenerator> singals = new List<SignalGenerator>();

 

        public List<SignalGenerator>Singals

        {

            get{ return singals; }

            set{ singals = value; }

        }

    }

    [Serializable]

    public class DatagridViewElementXML

    {

        privateList<SingalRow>signalArray = new List<SingalRow>();

        public List<SingalRow>SignalArray

        {

            get{ return signalArray; }

            set{ signalArray = value; }

        }

    }

}

在这里,DatagridViewElementXML是保存将序列化内容的类,本项目的需求将保存datagridview的二维数据,这里的处理方法是定义列元素SingalRow,将每一列的元素放到这里面,然后在DatagridViewElementXML类中将其写成一个集合,以此保存了一个二位的数组。

注意事项

在SingalRow中定义了List<SignalGenerator>Singals,而我们真正保存在Singals是SignalGenerator的子类,如ConstSignal,故而,要在SingalRow类得前面添加

[XmlInclude(typeof(ConstSignal))]

这一语句可以使子类能够序列化。

2)       序列化

private void TSMISave_Click(object sender, EventArgse)

        {

            FileStream stream = null;

           saveFileName = null;

            SaveFileDialog saveFileDialog = new SaveFileDialog();

           saveFileDialog.Filter = "XML文件|*.XML";

            if (saveFileDialog.ShowDialog() == DialogResult.OK)

            {

               saveFileName = saveFileDialog.FileName;

            }

            DatagridViewElementXML elementXML =SeriesXMLFunction(dataGridView1);

            XmlSerializer xs = newXmlSerializer(typeof(DatagridViewElementXML));

            try

            {

               stream = new FileStream(saveFileName,FileMode.Create, FileAccess.Write,FileShare.ReadWrite);

               xs.Serialize(stream, elementXML);

               stream.Close();

            }

            catch (Exceptionex)

            {

                Console.WriteLine(ex.ToString());

            }

        }

注意事项

这里,要注意一点,就是SaveFileDialog控件的使用,如果不加try语句,而当你保存没有点确定,而是按取消时,其实saveFileName的值依然是null,故而stream就不能被打开,而程序直接被关闭。加上try之后,可以捕获这一异常。

3)       反序列化

        private voidTSMIRead_Click(object sender, EventArgs e)

        {

           elementXML = null;

           openFileName = null;

            OpenFileDialog openFileDialog = new OpenFileDialog();

           openFileDialog.InitialDirectory = saveFileName;

           openFileDialog.Filter = "XML文件|*.XML";

            if (openFileDialog.ShowDialog() == DialogResult.OK)

            {

               openFileName = openFileDialog.FileName;

            }

            if (openFileName != null)

            {

                XmlSerializer xs = newXmlSerializer(typeof(DatagridViewElementXML));

                Stream stream = newFileStream(openFileName, FileMode.Open, FileAccess.Read,FileShare.Read);

               elementXML = xs.Deserialize(stream) as DatagridViewElementXML;

            }

            else

            {

                MessageBox.Show("读取XML失败");

            }

        }

注意事项

这里,要注意一点,就是OpenFileDialog控件的使用,如果不加try语句,而当你读取没有点确定,而是按取消时,其实openFileName的值依然是null,故而stream就不能被打开,而程序直接被关闭。这里用if语句来进行了判断,使得程序不至于崩溃和中途退出。

原创粉丝点击