2012-12-18 30 views
8

Khi tôi cố gắng lưu trữ một giá trị TimeSpan vào Cài đặt ApplicationData, tôi nhận được một lỗi vì không thể tuần tự hóa TimeSpan. Câu hỏi SO này cho thấy cách xử lý nó: How to serialize a TimeSpan to XMLTại sao System.TimeSpan không thể tuần tự hóa XML?

Tại sao TimeSpan không dễ dàng được tuần tự hóa?

Và, có danh sách các loại dữ liệu không thể được tuần tự không?

+1

Nó _is_ '[Serializable]'. Làm cho tiêu đề này trở thành xấu. –

+1

Không tranh luận, nhưng tại sao TimeSpan không được tuần tự hóa? –

+1

Nó sẽ tuần tự hóa. Chỉ cần sử dụng một SoapFormatter hoặc BinaryFormatter. –

Trả lời

7

Lý do nó sẽ không tuần tự hóa là vì XmlCustomFormatter không triển khai chức năng để tuần tự hóa nó.

Từ lớp XmlCustomFormatter, đây là một danh sách các dữ liệu serializable hỗ trợ (từ phương pháp FromDefaultValue):

DateTime

Date

Time

Bạn có thể xem cách nó được sử dụng để sắp xếp mọi thứ nếu bạn nhìn vào lớp XmlSerializationWriter trong tham chiếu nguồn:

Xem phương pháp WriteTypedPrimitive để biết thêm chi tiết về primites, vv

/// <include file='doc\XmlSerializationWriter.uex' path='docs/doc[@for="XmlSerializationWriter.WriteTypedPrimitive"]/*' /> 
    protected void WriteTypedPrimitive(string name, string ns, object o, bool xsiType) { 

Chi tiết về đối tượng và xml serialization:

/// <include file='doc\XmlSerializationWriter.uex' path='docs/doc[@for="XmlSerializationWriter.FromByteArrayBase64"]/*' /> 
    protected static byte[] FromByteArrayBase64(byte[] value) { 
     // Unlike other "From" functions that one is just a place holder for automatic code generation. 
     // The reason is performance and memory consumption for (potentially) big 64base-encoded chunks 
     // And it is assumed that the caller generates the code that will distinguish between byte[] and string return types 
     // 
     return value; 
    } 

    /// <include file='doc\XmlSerializationWriter.uex' path='docs/doc[@for="XmlSerializationWriter.FromByteArrayHex"]/*' /> 
    protected static string FromByteArrayHex(byte[] value) { 
     return XmlCustomFormatter.FromByteArrayHex(value); 
    } 

    /// <include file='doc\XmlSerializationWriter.uex' path='docs/doc[@for="XmlSerializationWriter.FromDateTime"]/*' /> 
    protected static string FromDateTime(DateTime value) { 
     return XmlCustomFormatter.FromDateTime(value); 
    } 

    /// <include file='doc\XmlSerializationWriter.uex' path='docs/doc[@for="XmlSerializationWriter.FromDate"]/*' /> 
    protected static string FromDate(DateTime value) { 
     return XmlCustomFormatter.FromDate(value); 
    } 

    /// <include file='doc\XmlSerializationWriter.uex' path='docs/doc[@for="XmlSerializationWriter.FromTime"]/*' /> 
    protected static string FromTime(DateTime value) { 
     return XmlCustomFormatter.FromTime(value); 
    } 

    /// <include file='doc\XmlSerializationWriter.uex' path='docs/doc[@for="XmlSerializationWriter.FromChar"]/*' /> 
    protected static string FromChar(char value) { 
     return XmlCustomFormatter.FromChar(value); 
    } 

    /// <include file='doc\XmlSerializationWriter.uex' path='docs/doc[@for="XmlSerializationWriter.FromEnum"]/*' /> 
    protected static string FromEnum(long value, string[] values, long[] ids) { 
     return XmlCustomFormatter.FromEnum(value, values, ids, null); 
    } 

    /// <include file='doc\XmlSerializationWriter.uex' path='docs/doc[@for="XmlSerializationWriter.FromEnum1"]/*' /> 
    protected static string FromEnum(long value, string[] values, long[] ids, string typeName) { 
     return XmlCustomFormatter.FromEnum(value, values, ids, typeName); 
    } 

    /// <include file='doc\XmlSerializationWriter.uex' path='docs/doc[@for="XmlSerializationWriter.FromXmlName"]/*' /> 
    protected static string FromXmlName(string name) { 
     return XmlCustomFormatter.FromXmlName(name); 
    } 

    /// <include file='doc\XmlSerializationWriter.uex' path='docs/doc[@for="XmlSerializationWriter.FromXmlNCName"]/*' /> 
    protected static string FromXmlNCName(string ncName) { 
     return XmlCustomFormatter.FromXmlNCName(ncName); 
    } 

    /// <include file='doc\XmlSerializationWriter.uex' path='docs/doc[@for="XmlSerializationWriter.FromXmlNmToken"]/*' /> 
    protected static string FromXmlNmToken(string nmToken) { 
     return XmlCustomFormatter.FromXmlNmToken(nmToken); 
    } 

    /// <include file='doc\XmlSerializationWriter.uex' path='docs/doc[@for="XmlSerializationWriter.FromXmlNmTokens"]/*' /> 
    protected static string FromXmlNmTokens(string nmTokens) { 
     return XmlCustomFormatter.FromXmlNmTokens(nmTokens); 
    } 
+0

Sửa lỗi nếu tôi sai nhưng không có lớp nào có tên là Ngày hoặc Giờ? – Peter

+0

@Petoj bạn nói đúng. Cả ba đều sử dụng 'DataTime'. – mydogisbox

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