以下のコードを使用して、カスタム オブジェクトのシリアライズとデシリアライズを試みました。
[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...完全を期すために、シリアル化および逆シリアル化する必要があるカスタム クラスを追加しました。
UPDATE 3...まあ、属性に影響する遅さの原因を発見したのかもしれませんが、そのSerializable
理由はわかりません。基本的に、5 つのプロパティに関連する 5 つのプライベート フィールドを明示的に宣言すると、結果として、最初のシリアル化 (または逆シリアル化) はほぼ瞬時に行われます。なんで?