Domanda

Considera questa classe di esempio:

[Serializable]
public class SomeClass
{
    private DateTime _SomeDateTime;

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

Vorrei modificare la serializzazione di qualsiasi DateTime dichiarato nella classe secondo le mie regole. I membri di questa classe cambieranno frequentemente e non voglio mantenere un serializzatore personalizzato per ogni modifica. Inoltre vorrei che questo comportamento fosse ereditato da sottoclassi e non codificasse un serializzatore personalizzato per ognuno. La serializzazione viene emessa da un servizio Web. Grazie per l'aiuto!

È stato utile?

Soluzione

guarda gli attributi OnSerializing e OnDeserializing per chiamare metodi personalizzati quando i tuoi oggetti sono serializzati. puoi implementare della logica personalizzata e disaccoppiare il processo di serializzazione dai tipi di dati effettivi.

Altri suggerimenti

Hai mai pensato di utilizzare semplicemente una data di annullamento

public DateTime? SomeDateTime {get; set;}

In questo modo puoi effettivamente avere un valore nullo come valore legittimo nella tua classe. In genere si desidera evitare la serializzazione personalizzata quando possibile. Una volta eseguita la serializzazione personalizzata come l'implementazione di ISerializable , allora sei bloccato con esso, e tutte le altre classi derivate sono bloccate con esso.

Ricordi che dolore nel sedere deve sempre sostituire i membri ISerializable per eccezioni personalizzate? Questo perché System.Exception implementa ISerializable e quindi tutte le eccezioni derivate (ciò significa tutto) devono implementare quei membri se mai ti aspetti che attraversino AppDomains.

Bene, puoi usare un " bool ShouldSerializeSomeDateTime () " metodo per abilitare / disabilitare la serializzazione dei singoli membri, ma non credo sia proprio quello di cui hai bisogno. Un'altra opzione comune è quella di aggiungere un membro che fa il formato stesso:

stringa pubblica SomeDateTimeFormatted {     ottenere {return theField == DateTime.MinValue? & Quot; " : theField.ToString (" R ");} // o qualunque altro formato     impostare {... opposite ...}   }

È meglio attenersi alla serializzazione integrata, se possibile, in parte per ridurre la quantità di codice che è necessario scrivere. Il suggerimento di Josh per un DateTime nullable (DateTime?) È buono, anche se potrebbe non essere abbastanza stringa vuota vs stringa formattata - mi aspetto che userebbe il markup xsi: nil.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top