序列化與還原序列化的定義與用處在網上可以索一大堆 我在這就不多說廢話了 如下:
.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);
}
}