DateRange
以下に示すように、静的参照を介して無限の概念を表すオブジェクトがあります。ご覧のとおり、Infinity を定義するエンド ポイントは、別のクラスの静的参照でもDatePoint.Past
ありDatePoint.Future
ます。
ここで、これをシリアライズし (シリアライゼーションを使用するディープ Clone メソッドの一部として)、エンドポイントを持つインスタンスがデシリアライズされるタイミングを知る必要がありますDateTime.Min
DateTime.Max
DateRange.Infinity
。だから私はそれを作る必要があると思いますISerializable
。
私の最初の実装の試みISerializable
はかなり貧弱です。しかし、私はそれが誰かにとってより迅速な修正を示唆することを期待してそれを示しています. NHibernate が db に格納して Infinity を再構成するためにいくつかの同様のコードを使用しDateRange
ましたが、それをシリアル化に適用する方法はまだわかりません。
DatePoint
はマークされ[Serializable]
ていますが、実装していませんISerializable
。
編集された質問
インフィニティをシリアライズ/デシリアライズするつもりはありません。私が探しているのは、逆シリアル化されたものを取り、DataRange
それが と同等かどうかを判断できる場所へのフックInfinity
です。
**
乾杯、ベリル
日付範囲
[Serializable]
[TypeConverter(typeof(DateRangeTypeConverter))]
public class DateRange : ValueObject, IRange<DatePoint, DateRange, TimeSpan>, ISerializable
{
/// <summary>
/// Returns a range spanning <see cref="DatePoint.Past"/> and <see cref="DatePoint.Future"/>.
/// </summary>
public static readonly DateRange Infinity = new DateRange(DatePoint.Past, DatePoint.Future);
/// <summary> The start of the <see cref="DateRange"/> range. </summary>
public DatePoint Start { get; protected set; }
/// <summary> The end of the <see cref="DateRange"/> range. </summary>
public DatePoint End { get; protected set; }
}
日付ポイント
public class DatePoint : ValueObject, IComparable<DatePoint>, IComparable<DateTime>, IComparable, IEquatable<DatePoint>, IEquatable<DateTime>, IFormattable
{
/// <summary>The undefined infinite past, smaller than any other date except itself.</summary>
public readonly static DatePoint Past = DateTime.MinValue;
/// <summary>The undefined infinite future, larger than any other date except itself.</summary>
public readonly static DatePoint Future = DateTime.MaxValue;
}
最初の ISerializable 試行
protected DateRange(SerializationInfo info, StreamingContext ctx) {
if (info == null)
throw new System.ArgumentNullException("info");
var start = (DatePoint)info.GetValue("Start", typeof(DatePoint));
var end = (DatePoint)info.GetValue("End", typeof(DatePoint));
// its Infinity if so
if((start.Equals(DatePoint.Past) && end.Equals(DatePoint.Future)))
return;
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
}