序列化与反序列化
来源:互联网 发布: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语句来进行了判断,使得程序不至于崩溃和中途退出。
- 序列化与反序列
- 序列化与反序列
- XML序列化与反序列化
- 对象序列化与反序列化
- 序列化与反序列化
- 转载:序列化与反序列化
- c#序列化与反序列化
- java序列化与反序列化
- XML序列化与反序列化
- 序列化与反序列化
- 序列化与反序列化
- C#序列化与反序列化
- java序列化与反序列化
- XML序列化与反序列化
- 再看序列化与反序列化
- 序列化与反序列化对象
- 序列化与反序列化
- .NET序列化与反序列化
- 关于no office executable found!解决方法
- webservice示例
- Javascript的一些困惑
- TEX介绍
- 跨浏览器实现自定义事件处理
- 序列化与反序列化
- Javascript 中的大括号{}和中括号[]详解
- Flex和Java整合错误 [FaultEvent fault=[RPC Fault faultString="Send failed"
- MyEclipse:Address already in use
- Opensolaris: TCL和 Expect 编译与安装
- 微分方程解特殊差分模型(解决一般的应用3)
- 3.2类与对象
- 配置Android开发环境
- 申请Google Map Android API Key