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);
}
}

 

posted on 2010-01-27 12:22  蘑菇  阅读(1408)  评论(0编辑  收藏  举报