2010-05-18 46 views
16

Recibo este mensaje, "La cadena '22/7/2006 12:00:00 AM' no es un valor AllXsd válido.", Al deserializar un XML, el elemento contiene una fecha, esta es la propiedad que se supone que deben correlacionarse con el elemento:XmlSerializer: La cadena '' no es un valor AllXsd válido

[XmlElement("FEC_INICIO_REL",typeof(DateTime))] 
public DateTime? FechaInicioRelacion { get; set; } 

estoy haciendo algo mal?

ACTUALIZACIÓN: Aquí es el XML:

<Detalle> 
    <NOM_ASOC>Financiera Panameña</NOM_ASOC> 
    <DESCR_CORTA_RELA>PREST. PERSONAL</DESCR_CORTA_RELA> 
    <FEC_INICIO_REL>7/22/2006 12:00:00 AM</FEC_INICIO_REL> 
    <FEC_FIN_REL>9/22/2008 12:00:00 AM</FEC_FIN_REL> 
    <MONTO_ORIGINAL>1160.0000</MONTO_ORIGINAL> 
    <NUM_PAGOS>2</NUM_PAGOS> 
    <DESCR_FORMA_PAGO>PAGOS VOLUNTARIOS</DESCR_FORMA_PAGO> 
    <IMPORTE_PAGO>59.9400</IMPORTE_PAGO> 
    <FEC_ULTIMO_PAGO>11/15/2006 12:00:00 AM</FEC_ULTIMO_PAGO> 
    <MONTO_ULTIMO_PAGO>0.0000</MONTO_ULTIMO_PAGO> 
    <DESCR_OBS_CORTA /> 
    <SALDO_ACTUAL>1078.3900</SALDO_ACTUAL> 
    <NUM_DIAS_ATRASO>0</NUM_DIAS_ATRASO> 
    <HISTORIA>1</HISTORIA> 
    <MONTO_CODIFICADO /> 
    <FEC_ACTUALIZACION>10/17/2008 12:00:00 AM</FEC_ACTUALIZACION> 
    <COD_GRUPO_ECON> </COD_GRUPO_ECON> 
    <TIPO_ASOC> </TIPO_ASOC> 
    <NUM_REFER>2008628116</NUM_REFER> 
</Detalle> 
+2

Por favor, publique el XML que causa este problema. Si es posible, restrinja esto a un ejemplo que solo tiene una sola propiedad 'DateTime?'. Por cierto, observe que 'typeof (DateTime?)' No es lo mismo que 'typeof (DateTime)'. –

+0

Hola, publiqué el XML, gracias por su ayuda. – ryudice

Respuesta

15

Resolví el problema al guardar la fecha en una cadena y luego crear un getter que analiza la fecha y la devuelve como DateTime. código

muestra:

[XmlElement("Valid")] 
    public string _Valid 
    { 
     get; 
     set; 
    } 

    [XmlIgnore] 
    public bool? Valid 
    { 
     get 
     { 
      if (!string.IsNullOrWhiteSpace(_Valid)) 
      { 
       return bool.Parse(_Valid); 
      } 

      return null; 
     } 
    } 
+0

Consulte la respuesta en http://stackoverflow.com/a/661898/288747 para obtener más información sobre este tema – Seph

+2

@ryudice, ¿cuál es su código para resolver el problema? – burhan

2

Trate de añadir "IsNullable = true" atributo.

10

AllocationDate es un campo obligatorio, pero puede ser suministrado como blanco el cual es manejado por representarla por AllocationDateString:

private DateTime? _allocationDate; 

    [XmlIgnore] 
    public DateTime? AllocationDate 
    { 
     get { return _allocationDate; } 
     set { _allocationDate = value; } 
    } 

    [XmlAttribute("AllocationDateTime")] 
    public string AllocationDateTimeString 
    { 
     get 
     { 
      return _allocationDate.HasValue ? XmlConvert.ToString(_allocationDate.Value, XmlDateTimeSerializationMode.Unspecified) 
      : string.Empty; 
     } 
     set 
     { 
      _allocationDate = !string.IsNullOrEmpty(value) ? XmlConvert.ToDateTime(value, XmlDateTimeSerializationMode.Unspecified) : (DateTime?)null; 
     } 
    } 
+0

Me llevó en la dirección correcta! En mi código, no quiero un tipo que acepte nulos, por lo que el 'DateTime.Parse' (utilizado en mi propio código) lanzará una excepción si falla la serialización. –

3

que se dan cuenta de que esto es una cuestión de edad, pero tuve este problema hoy y encontré una solución usando propiedades y casting.

private string _date; // Private variable to store XML string 

// Property that exposes date. Specifying the type forces 
// the serializer to return the value as a string. 
[XmlElement("date", Type = typeof(string))] 
public object Date { 
    // Return a DateTime object 
    get 
    { 
     return 
      !string.IsNullOrEmpty(_date) ? 
      (DateTime?) Convert.ToDateTime(_date) : 
      null; 
    } 
    set { _date = (string)value; } 
} 

Ahora, cada vez que necesite hacer referencia a la fecha, sólo tiene que llamar:

var foo = (DateTime?)Bar.Date 

Ha estado trabajando muy bien para mí desde entonces. Si no te importa agregar el yeso extra en tu código, ¡también puedes hacerlo de esta manera!

Editar: Debido al comentario de Dirk, decidí volver a visitar mi implementación en una sucursal separada. En lugar de utilizar una clase object, que es propensa a errores del compilador en tiempo de ejecución, devuelvo el valor como una cadena.

[XmlElement("date")] 
public string Date; 

Lo que hace la declaración mucho más simple. Pero al intentar leer de la variable, ahora debe proporcionar comprobaciones nulas.

var foo = string.IsNullOrEmpty(Date) ? Convert.ToDateTime(Date) : (DateTime?) null 

Funciona de la misma manera como la implementación anterior, a excepción de la fundición y cheques nulos ocurren en un lugar diferente. Quiero poder escribir mi modelo y luego olvidarme de él, por lo que aún prefiero mi implementación.

En otra nota, agregué una corrección al elenco antes de la edición: DateTime debe ser DateTime?.

+1

Funciona si se usa correctamente. Pero si es elegante es una pregunta diferente y yo no lo llamaría así. Es muy fácil escribir código que compila bien pero arroja una excepción en el tiempo de ejecución porque el tipo de propiedad es 'objeto'. Si '_date' contiene una cadena válida, incluso un aspecto inocente' obj.Date = obj.Date; 'arrojará una excepción. Por lo menos, '(string) value' tendría que ser reemplazado por' value.ToString() '(con una null-check). – Dirk

+0

Me aseguraré de usar la palabra * elegante * ligeramente en el futuro. – dimiguel

1

Para aquellos que se encuentran con esto aquí es la respuesta más simple, me encontré con el mismo problema, pero no necesito Numible DateTime. XMLElement solo necesita un get not a set cuando renderiza XML.

private DateTime _fechaInicioRelacion; 

[XmlElement("FEC_INICIO_REL")] 
public string FechaInicioRelacionString 
{ 
    get 
     { 
      return _fechaInicioRelacion.ToString("yyyy-MM-ddTHH:mm:ss"); 
     } 
    set { } 
} 

[XmlIgnore] 
public DateTime FechaInicioRelacion 
{ 
    get { return _fechaInicioRelacion; } 
    set { _fechaInicioRelacion = value; } 
} 
+0

La pregunta era sobre la deserialización. –

Cuestiones relacionadas