特定の.NETタイプのシリアル化をオーバーライドする
-
05-07-2019 - |
質問
このクラスの例を検討してください:
[Serializable]
public class SomeClass
{
private DateTime _SomeDateTime;
public DateTime SomeDateTime
{
get { return _SomeDateTime; }
set { _SomeDateTime = value; }
}
}
独自のルールに従って、クラスで宣言されたDateTimeのシリアル化を変更したいと思います。このクラスのメンバーは頻繁に変更されるため、変更ごとにカスタムシリアライザーを維持する必要はありません。また、この動作をサブクラスに継承し、すべてのカスタムシリアライザーをコーディングしないようにします。シリアル化はWebサービスによって出力されています。助けてくれてありがとう!
解決
OnSerializingおよびOnDeserializing属性を見て、オブジェクトがシリアル化されるときにカスタムメソッドを呼び出します。そこにいくつかのカスタムロジックを強制し、シリアル化プロセスを実際のデータ型から切り離すことができます。
他のヒント
Nullableの日付時刻を単純に使用することを考えましたか
public DateTime? SomeDateTime {get; set;}
この方法では、クラス内で正当な値として実際にnull値を持つことができます。通常、可能な場合は常にカスタムシリアル化を避けます。 ISerializableの実装などのカスタムシリアル化を行うと、 、それからあなたはそれで立ち往生し、他のすべての派生クラスはそれで立ち往生します。
カスタム例外の場合、常にISerializableメンバーをオーバーライドする必要があることは非常に痛いことを覚えていますか?これは、System.ExceptionがISerializableを実装しているため、すべての派生例外(つまり、すべてを意味する)がAppDomainを超えることが予想される場合、それらのメンバーを実装する必要があるためです。
まあ、" bool ShouldSerializeSomeDateTime()"個々のメンバーのシリアル化を有効/無効にする方法がありますが、それはあなたが必要とするものではないと思います。別の一般的なオプションは、フォーマット自体を実行するメンバーを追加することです:
パブリック文字列SomeDateTimeFormatted { get {return theField == DateTime.MinValue? "" :theField.ToString(" R");} //または任意の形式 セット{...反対...} }
ただし、可能な場合は組み込みのシリアル化を使用することをお勧めします-部分的には、記述する必要のあるコードの量を減らすためです。 Joshのnull許容DateTime(DateTime?)に対する提案は良いものですが、まだ空の文字列とフォーマットされた文字列ではないかもしれません-xsi:nilマークアップを使用することを期待しています。