📄 序列化機制.txt
字号:
using System.Runtime.Serialization;
namespace SerializationSample {
[Serializable()]
public class Schedule {
protected System.DateTime start;
protected System.DateTime end;
// 每个时间间隔所要增加的毫秒数
protected long interval;
public System.DateTime Start {get{return start;}set{start=value;}}
public System.DateTime End {get{return end;}set{end=value;}}
public long Interval {get{return interval;}set{interval=value;}}
public Schedule(System.DateTime Start, System.DateTime End, long Interval) {
start=Start;
end=End;
interval=Interval;
}
// 如果已经到了结束的时间,则返回结束时间,否则返回下一次运行的时间
public System.DateTime NextRunTime {
get {
System.TimeSpan ts = new System.TimeSpan(end.Ticks-System.DateTime.Now.Ticks);
if(ts.Milliseconds>0) {
return System.DateTime.Now.AddMilliseconds(interval);
} else {
return end;
}
}
}
}
}
自定义序列化:
下面我就向大家介绍自定义序列化以及反序列化的具体过程。首先,程序的类必须实现System.Runtime.Serialization.ISerializable接口,该接口的功能就是允许对象控制其自己的序列化和反序列化过程。所以我们得重新定义上面的类:
[Serializable()]
public class ScheduleCustom : System.Runtime.Serialization.Iserializable
接下来,我们必须对该接口调用GetObjectData()的实现,也即我们必须在上面的类中给出GetObjectData()的具体实现。其函数原型如下:
void GetObjectData(SerializationInfo info, StreamingContext context);
上面的类中GetObjectData()的具体实现如下:
public void GetObjectData(SerializationInfo info,StreamingContext context) {
// 运用info对象来添加你所需要序列化的项
info.AddValue("start", start);
info.AddValue("end", end);
info.AddValue("interval", interval);
}
然而对于这么一个简单的方法,读者可能不能理会到系列化带来的强大功能,所以下面我就给这个方法添加一些东西。如果在系列化过程中我们要查看类型为DateTime的"start"属性的输出的话,其结果会是.Net框架默认的格式:
2002-12-19T14:09:13.3457440-07:00
而对于没有.Net框架的用户,或是在其他时间区域内的用户而言,这么一个格式的时间可能是非常难以理解的,所以我们有必要将时间的格式转化为格林威治标准时间格式,于是修改GetObjectData()方法如下:
public void GetObjectData(SerializationInfo info,StreamingContext context) {
// 运用info对象来添加你所需要序列化的项
// 同时,将"start"和"end"属性的时间格式转化为格林威治标准时间格式
info.AddValue("start", System.TimeZone.CurrentTimeZone.ToUniversalTime(start));
info.AddValue("end", System.TimeZone.CurrentTimeZone.ToUniversalTime(end));
info.AddValue("interval", interval);
info.AddValue("timeformat", "utc");
}
这样一来,我们在系列化过程中查看"start"属性时就会得到如下结果:
8/19/2002 9:09:13 PM
同时请注意我们在GetObjectData()方法中添加的一个名为"timeformat"的额外属性,通过它我们可以方便的知道系列化过程中所使用的时间格式。如果有兴趣的话,你还可以从System.Globalization.DateTimeFormatInfo这个名字空间中获取更多有关时间格式的信息。
自定义反序列化:
你可以通过调用一个自定义的构造函数来完成自定义反序列化的操作。该构造函数的定义如下:
public ScheduleCustom (SerializationInfo info,StreamingContext context);
在上面的类中,我们的ScheduleCustom()方法将完成把时间格式从格林威治标准时间格式反序列化为当地时间的格式的操作,其函数实现如下:
public ScheduleCustom (SerializationInfo info,StreamingContext context) {
this.start = info.GetDateTime("start").ToLocalTime();
this.end = info.GetDateTime("end").ToLocalTime();
this.interval = info.GetInt32("interval");
}
在完成自定义序列化和自定义反序列化后,我们的时间安排程序变成了如下形式:
using System;
using System.Runtime.Serialization;
namespace SerializationSample {
[Serializable()]
public class ScheduleCustom : System.Runtime.Serialization.ISerializable {
protected System.DateTime start;
protected System.DateTime end;
// 每个时间间隔所要增加的毫秒数
protected long interval;
public System.DateTime Start {get{return start;}set{start=value;}}
public System.DateTime End {get{return end;}set{end=value;}}
public long Interval {get{return interval;}set{interval=value;}}
public ScheduleCustom(System.DateTime Start, System.DateTime End, long Interval) {
start=Start;
end=End;
interval=Interval;
}
// 如果已经到了结束的时间,则返回结束时间,否则返回下一次运行的时间
public System.DateTime NextRunTime {
get {
System.TimeSpan ts = new System.TimeSpan(end.Ticks-System.DateTime.Now.Ticks);
if(ts.Milliseconds>0) {
return System.DateTime.Now.AddMilliseconds(interval);
} else {
return end;
}
}
}
public void GetObjectData(SerializationInfo info,StreamingContext context) {
// 运用info对象来添加你所需要序列化的项
// 同时,将"start"和"end"属性的时间格式转化为格林威治标准时间格式
info.AddValue("start", System.TimeZone.CurrentTimeZone.ToUniversalTime(start));
info.AddValue("end", System.TimeZone.CurrentTimeZone.ToUniversalTime(end));
info.AddValue("interval", interval);
info.AddValue("timeformat", "utc");
}
public ScheduleCustom (SerializationInfo info,StreamingContext context) {
this.start = info.GetDateTime("start").ToLocalTime();
this.end = info.GetDateTime("end").ToLocalTime();
this.interval = info.GetInt32("interval");
}
}
}
四.总结:
本文向大家介绍了.Net框架下系列化机制的一些基本概念和基本的运用方法,读者在读完本文后,应该对以下几个概念有个初步了解:二进制系列化、XML系列化、基本序列化和自定义系列化,并应能够完成一些基本的系列化应用。最后,希望大家能合理有效的运用系列化机制并发挥它的功效以更好地满足实际工作需要。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -