XmlSerializer 序列化不了 TimeSpan,可以做个辅助string属性来处理.如下:
使用string 来处理有一些优点就是,打开序列化后的文件,能方便的识别出 时间并修改. 比long 人性化一些.
把TimeSpan 属性设置为不序列化,
<pre name="code" class="csharp"> [XmlIgnore]
public TimeSpan 时间 { get; set; }
public string 时间string
{
get { return 时间.ToString(); }
set { 属性转换(x => 时间 = x, 时间转换, value); }
}
/// <summary>
/// 属性转换s the specified 属性设置方法.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="属性设置方法">The 属性设置方法.</param>
/// <param name="值转换方法">The 值转换方法.</param>
/// <param name="value">The value.</param>
public static void 属性转换<T>(Func<T, T> 属性设置方法, Func<string, Tuple<bool, T>> 值转换方法, string value)
{
var k = 值转换方法(value);
if (k.Item1)
{
属性设置方法.Invoke(k.Item2);
}
}
private Tuple<bool, TimeSpan> 时间转换(string value)
{
TimeSpan r;
bool k = (TimeSpan.TryParse(value, out r));
return new Tuple<bool, TimeSpan>(k, r);
}
转换方法是用了泛型来转换.这样可以方便的扩展其他属性类型如 颜色:
[XmlIgnore]
public SolidColorBrush 颜色 { get; set; }
public string 颜色s
{
get { return 颜色.Color.ToString(); }
set { 属性转换(x => 颜色 = x, 颜色转换, value); }
}
private Tuple<bool, SolidColorBrush> 颜色转换(string value)
{
object convertFromString = ColorConverter.ConvertFromString(value);
bool k = (convertFromString == null);
if (k) return new Tuple<bool, SolidColorBrush>(false, null);
var r = new SolidColorBrush((Color) convertFromString);
return new Tuple<bool, SolidColorBrush>(true, r);
}