Pregunta

Por favor considere esta clase de ejemplo:

[Serializable]
public class SomeClass
{
    private DateTime _SomeDateTime;

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

Me gustaría alterar la serialización de cualquier DateTime declarada en la clase de acuerdo con mis propias reglas. Los miembros de esta clase cambiarán con frecuencia y no quiero mantener un serializador personalizado para cada cambio. También me gustaría que este comportamiento sea heredado por las subclases y no codifique un serializador personalizado para cada uno. La serialización está siendo emitida por un servicio web. Gracias por cualquier ayuda!

¿Fue útil?

Solución

observe los atributos de OnSerializing y OnDeserializing para llamar a métodos personalizados cuando sus objetos se serializan. puede impulsar un poco de lógica personalizada allí y desacoplar el proceso de serialización de los tipos de datos reales.

Otros consejos

¿Ha pensado simplemente en usar una fecha y hora de Nullable

public DateTime? SomeDateTime {get; set;}

De esta manera, puede tener un valor nulo como valor legítimo en su clase. Normalmente, usted desea evitar la serialización personalizada siempre que sea posible. Una vez que realice la serialización personalizada, como la implementación de ISerializable , entonces estás atascado y todas las demás clases derivadas están atascadas.

¿Recuerda lo doloroso que es tener que anular siempre los miembros de ISerializable para las excepciones personalizadas? Esto se debe a que System.Exception implementa ISerializable y, por lo tanto, todas las excepciones derivadas (es decir, todo) deben implementar esos miembros si alguna vez espera que se crucen los Dominios de aplicaciones.

Bueno, puede usar un " bool ShouldSerializeSomeDateTime () " método para habilitar / deshabilitar la serialización de miembros individuales, pero no creo que sea lo que necesita. Otra opción común es agregar un miembro que haga el formato en sí:

cadena pública SomeDateTimeFormatted {     get {return theField == DateTime.MinValue? " " : theField.ToString (" R ");} // o cualquier formato     establecer {... opuesto ...}   }

Sin embargo, es mejor seguir con la serialización incorporada si puede, en parte para reducir la cantidad de código que necesita escribir. La sugerencia de Josh para un DateTime anulable (¿DateTime?) Es buena, aunque aún podría no ser una cadena vacía o una cadena formateada: espero que use el marcado xsi: nil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top