1

DateRange以下に示すように、静的参照を介して無限の概念を表すオブジェクトがあります。ご覧のとおり、Infinity を定義するエンド ポイントは、別のクラスの静的参照でもDatePoint.PastありDatePoint.Futureます。

ここで、これをシリアライズし (シリアライゼーションを使用するディープ Clone メソッドの一部として)、エンドポイントを持つインスタンスがデシリアライズされるタイミングを知る必要がありますDateTime.MinDateTime.MaxDateRange.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)
    {
    }
4

3 に答える 3

2

静的メンバーのインスタンスを作成できないため、それらをシリアル化または逆シリアル化することはできません。

protected set代わりに、何もしない と必要なget結果を返す を使用して、適切なパブリック プロパティを作成することもできます。その後、プロパティをシリアル化できますが、逆シリアル化はできません。これは無駄な作業になるためです...

于 2012-10-02T15:06:31.907 に答える
1

逆シリアル化後にオブジェクトを実装IObjectReferenceして置き換えることができます。

object IObjectReference.GetRealObject(StreamingContext context)
{
    if (Start.Equals(DatePoint.Past) && End.Equals(DatePoint.Future))
    {
        return Infinity;
    }
}

ドキュメントを参照してください。

于 2012-10-03T06:31:22.310 に答える
0

私は自分の質問に答えるのが好きではありませんが、うまくいくように見える解決策があります。おそらく、そもそも質問を正しくしなかっただけで、質問したときに以下のことを行う方法がわかりませんでした。

誰かがそれを行うためのより良い方法を見つけたら、そう言ってください!

乾杯、
ベリル

DateRange に ISerializable を実装させる

    protected DateRange(SerializationInfo info, StreamingContext context) {
        if (info == null)
            throw new ArgumentNullException("info");

        var foundPast = (bool) info.GetValue("thePast", typeof (bool));
        if (foundPast)
            Start = DatePoint.Past;
        var foundFuture = (bool) info.GetValue("theFuture", typeof (bool));
        if (foundFuture)
            End = DatePoint.Future;
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("thePast", Start.Equals(DatePoint.Past), typeof(bool));
        info.AddValue("theFuture", End.Equals(DatePoint.Future), typeof(bool));
    }
于 2012-10-02T17:12:31.353 に答える