3

このクラスの例を検討してください:

[Serializable]
public class SomeClass
{
    private DateTime _SomeDateTime;

    public DateTime SomeDateTime
    {
        get { return _SomeDateTime; }
        set { _SomeDateTime = value; }
    }
}

私自身のルールに従って、クラスで宣言された DateTime のシリアル化を変更したいと思います。このクラスのメンバーは頻繁に変更されるため、変更ごとにカスタム シリアライザーを維持したくありません。また、この動作をサブクラスに継承し、すべてのカスタム シリアライザーをコーディングしないようにしたいと考えています。シリアル化は Web サービスによって出力されています。助けてくれてありがとう!

4

3 に答える 3

3

OnSerializing および OnDeserializing 属性を調べて、オブジェクトがシリアル化されたときにカスタム メソッドを呼び出します。そこにいくつかのカスタムロジックを実装し、シリアライズプロセスを実際のデータ型から切り離すことができます。

于 2008-10-06T14:13:46.467 に答える
3

Nullable日時を単純に使用することを考えましたか

public DateTime? SomeDateTime {get; set;}

このようにして、実際に null 値をクラスの正当な値として持つことができます。通常、カスタムのシリアル化は可能な限り避けたいと考えています。ISerializableの実装などのカスタム シリアル化を行うと、それに固執し、他のすべての派生クラスもそれに固執します。

カスタム例外の ISerializable メンバーを常にオーバーライドしなければならないのは大変なことです。これは、System.Exception が ISerializable を実装しているため、派生したすべての例外 (つまりすべて) が AppDomains をまたぐことが予想される場合は、これらのメンバーを実装する必要があるためです。

于 2008-10-06T11:08:42.860 に答える
0

「bool ShouldSerializeSomeDateTime()」メソッドを使用して、個々のメンバーのシリアル化を有効/無効にすることができますが、それは必要なものではないと思います。別の一般的なオプションは、フォーマット自体を行うメンバーを追加することです。

public string SomeDateTimeFormatted { get { return theField == DateTime.MinValue ? "" : theField.ToString("R");} // または任意のフォーマット セット { ... 反対 ...} }

ただし、可能であれば組み込みのシリアライゼーションに固執することをお勧めします。これは、記述する必要があるコードの量を減らすためでもあります。Null可能なDateTime(DateTime?)に対するJoshの提案は良いものですが、まだ空の文字列とフォーマットされた文字列ではないかもしれません.xsi:nilマークアップを使用すると思います。

于 2008-10-06T11:14:44.737 に答える