c#序列化与反序列化
序列化与反序列化的定义与用处在网上可以索一大堆 我在这就不多说废话了 如下:
.NET提供了三种序列化方式1、XML Serializer 2、SOAP Serializer 3、BinarySerializer
本例用的是1、XML Serializer
问题:在数据库记录对某一产品的约束时,这个约束随对产品的认识增强 对产品约束项也随之增多
如果用列字段来记录本产品的约束的话 需要不断的对表结构调整 这对整个开发造成很多麻烦
我们把可以定义一个约束类 然后对此类序列化成一个XML 存入数据库须要时可对他反序列化
约束项可以随时增加(只能比之前项多 而不能少) 删除项时会对已序列化的XML反序列化时出错
这样就能减少操作数据库字段时带来的麻烦
定义约束类,Serializable 属性对它进行标记--此类可以被序列化 如下所示:
[Serializable]
public class BatchConstraints
{
public DateTime From { get; set; }
[XmlIgnore]
public TimeSpan PeriodTime { get; set; }
public int BatchCount { get; set; }
[XmlElement("PeriodTime")]
public String Period
{
get
{
return PeriodTime.ToString();
}
set
{
PeriodTime = TimeSpan.Parse(value);
}
}
//可随时增加所需约束
}
在序列化时,其结果如下所示:
<BatchConstraints xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<From>2009-04-14T00:00:00</From>
<BatchCount>1</BatchCount>
<PeriodTime>1.00:00:00</PeriodTime>
</BatchConstraints>
注意:1.TimeSpan 类型是不能被序列化的, 我们为public TimeSpan PeriodTime { get; set; }设置了XmlIgnore,
在序列化时PeriodTime就不会被序列化,我们可以把TimeSpan转化成string类型序列化存入数据库,如:[XmlElement("PeriodTime")]
public String Period
2.约束项可以随时增加(只能比之前项多 而不能少) 删除项时会对已序列化的XML反序列化时出错
方法如下
//序列化
BatchConstraints mSchedule = new BatchConstraints();
mSchedule.From = RegisterDate;
mSchedule.Period = Period;
mSchedule.BatchCount = BatchCount;
XElement mBatchPublishSchedule = XMLHelp.XmlSerializer(mSchedule);
//反序列化
BatchConstraints settingList = XMLHelp.XmlDeserialize<BatchConstraints>(XElement(数据库取出的XML字段));
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static XElement XmlSerializer<T>(T obj)
{
try
{
ser = new XmlSerializer(obj.GetType());
Stream stream = new MemoryStream();
ser.Serialize(stream, obj);
stream.Seek(0, SeekOrigin.Begin);
using (StreamReader reader = new StreamReader(stream))
{
_XElement = XElement.Load(reader);
}
stream.Close();
return _XElement;
}
catch
{
return null;
}
}
/// <summary>
/// 反序列化
/// </summary>
public static T XmlDeserialize<T>(XElement xe)
{
try
{
ser = new XmlSerializer(typeof(T));
return (T)ser.Deserialize(xe.CreateReader());
}
catch
{
return default(T);
}
}