2010-05-18 39 views
16

Tôi nhận được thông báo này, "Chuỗi '7/22/2006 12:00:00 AM' không phải là giá trị AllXsd hợp lệ.", Khi deserializing một XML, phần tử chứa ngày, đây là thuộc tính được cho là ánh xạ tới phần tử:XmlSerializer: Chuỗi '' không phải là giá trị AllXsd hợp lệ

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

Tôi có làm gì sai không?

UPDATE: Đây là 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

Vui lòng đăng XML gây ra sự cố này. Nếu có thể, hãy thu hẹp điều này xuống một ví dụ chỉ có một thuộc tính 'DateTime?' Duy nhất. BTW, lưu ý rằng 'typeof (DateTime?)' Không giống với 'typeof (DateTime)'. –

+0

Xin chào, tôi đã đăng XML, cảm ơn sự giúp đỡ của bạn. – ryudice

Trả lời

15

Tôi đã giải quyết vấn đề bằng cách lưu ngày tháng trong chuỗi và sau đó tạo trình thu thập dữ liệu phân tích ngày và trả về ngày tháng làm Ngày giờ. đang

mẫu:

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

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

      return null; 
     } 
    } 
+0

Xem câu trả lời tại http://stackoverflow.com/a/661898/288747 để biết thêm thông tin về sự cố này – Seph

+2

@ryudice, mã của riêng bạn để giải quyết vấn đề là gì? – burhan

2

Cố gắng thêm "IsNullable = true" thuộc tính.

10

AllocationDate là một lĩnh vực bắt buộc nhưng có thể được cung cấp như trống đó được xử lý bởi đại diện cho nó bằng cách 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

Giúp tôi đi đúng hướng! Trong mã của tôi tôi không muốn một loại nullable, do đó, 'DateTime.Parse' (được sử dụng trong mã của riêng tôi) sẽ ném một ngoại lệ nếu serialization không thành công. –

3

tôi nhận ra rằng đây là một câu hỏi cũ, nhưng tôi đã có vấn đề này ngày hôm nay và tôi tìm thấy một workaround bằng cách sử dụng tài sản và đúc.

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; } 
} 

Bây giờ, bất cứ khi nào bạn cần phải tham khảo ngày, bạn chỉ cần gọi:

var foo = (DateTime?)Bar.Date 

Nó được làm việc tốt cho tôi kể từ đó. Nếu bạn không nhớ thêm các diễn viên phụ trong mã của bạn, bạn có thể làm điều đó theo cách này!

Chỉnh sửa: Do nhận xét của Dirk, tôi quyết định xem lại việc triển khai của mình trong một nhánh riêng biệt. Thay vì sử dụng lớp object, dễ bị lỗi trình biên dịch thời gian chạy, tôi trả về giá trị dưới dạng chuỗi.

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

Điều này làm cho việc khai báo đơn giản hơn nhiều. Nhưng khi cố gắng đọc từ biến bạn cần phải cung cấp kiểm tra null.

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

Nó hoạt động chính xác giống như cách triển khai trước đó, ngoại trừ kiểm tra truyền và kiểm tra rỗng xảy ra ở một vị trí khác. Tôi muốn có thể viết mô hình của mình và sau đó quên nó đi, vì vậy tôi vẫn thích thực hiện của tôi hơn.

Lưu ý khác, tôi đã thêm chỉnh sửa cho dàn diễn viên trước khi chỉnh sửa: DateTime phải là DateTime?.

+1

Nó hoạt động nếu được sử dụng đúng cách. Nhưng cho dù nó thanh lịch là một câu hỏi khác và tôi sẽ không gọi nó như thế. Thật dễ dàng để viết mã biên dịch tốt nhưng ném một ngoại lệ vào thời gian chạy vì loại thuộc tính là 'đối tượng'. Nếu '_date' chứa một chuỗi hợp lệ thì ngay cả một cái nhìn vô tội' obj.Date = obj.Date; 'sẽ ném và ngoại lệ. Ít nhất '(chuỗi) giá trị' sẽ phải được thay thế bằng' value.ToString() '(với một null-check). – Dirk

+0

Tôi sẽ đảm bảo sử dụng từ * thanh lịch * nhẹ trong tương lai. – dimiguel

1

Đối với những người gặp vấn đề này ở đây là câu trả lời đơn giản nhất, tôi đã gặp phải vấn đề tương tự, nhưng không cần DateTime không thể sử dụng. XMLElement chỉ cần một lệnh không được thiết lập khi hiển thị 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

Câu hỏi đặt ra là về deserialization. –

Các vấn đề liên quan