我尝试使用下面的代码对自定义对象进行序列化和反序列化。
[Serializable]
public class TaskProperty
{
public int Id { get; set; }
public DateTime ScheduleTime { get; set; }
public TimeSpan InitializationTime { get; set; }
public Nullable<DateTime> InstantOfStart { get; set; }
public TimeSpan TotalElapsedTime { get; set; }
}
// Main
var serializer = new DataContractSerializer(typeof(TaskProperty));
var reader = new FileStream("myfile.xml", FileMode.Open);
TaskProperty deserialized = (TaskProperty)(serializer.ReadObject(reader));
reader.Close();
Console.WriteLine("deserialized: {0}", deserialized);
如果TaskProperty
类用DataContract
属性修饰(并且DataMember
每个属性都用属性),反序列化比用属性修饰时快得多Serializable
:
- 使用
DataContract
和DataMember
属性,反序列化几乎是立即的; - 使用
Serializable
属性,反序列化非常慢(大约需要 30 秒)。
为什么?
更新...此外,如果反序列化之前是序列化相同类型的对象(显然具有不同的内容),则序列化速度慢而反序列化速度快。类似地,如果序列化之前是反序列化相同类型的对象,反序列化速度很慢,而序列化速度很快。
更新 2...为了完整起见,我添加了应该序列化和反序列化的自定义类。
更新3 ...好吧,也许我发现了影响Serializable
属性的缓慢的原因,但我不明白为什么。本质上,如果我明确声明与五个属性相关的五个私有字段,那么第一次序列化(或反序列化)几乎是即时的。为什么?