2013-06-19 30 views
2

我創建了以下自定義類來處理特定字符串(「YYY-MM-DD」)作爲動態當前值的表示形式。有幾個擴展,縮小和ToString函數可以幫助程序員進行內碼轉換。Xml使用縮小運算符對屬性進行反序列化

我的問題是當我使用XmlSerializer,一個使用MyDateTime的類,我反序列化。我儘管XmlSerializer會在使用反射之前使用Narrowing Operator CType(rightSide As String) As MyDateTime作爲對象初始值設定項。

如果我希望將MyDateTime的xml反序列化類屬性與Narrowing Operator CType(rightSide As String) As MyDateTime一起啓動,我應該怎麼做?

Public Class MyDateTime 

Const cstUniversalTodayValue As String = "YYYY-MM-DD" 

Dim _internalStringRepresentation As String 
Dim _internaValue As MyDateTime 

Public ReadOnly Property DynamicToday As Boolean 
    Get 
     Return _internalStringRepresentation = cstUniversalTodayValue 
    End Get 
End Property 

Public Shared Widening Operator CType(rightSide As MyDateTime) As MyDateTime 

    Return rightSide._internaValue 
End Operator 
Public Shared Widening Operator CType(rightSide As MyDateTime) As String 

    Return rightSide._internalStringRepresentation 
End Operator 

Public Shared Narrowing Operator CType(rightSide As MyDateTime) As MyDateTime 

    Return New MyDateTime With {._internalStringRepresentation = rightSide.ToString("yyyy-MM-dd"), ._internaValue = rightSide} 
End Operator 
Public Shared Narrowing Operator CType(rightSide As String) As MyDateTime 

    Dim instance = New MyDateTime With {._internalStringRepresentation = rightSide} 
    If instance.DynamicToday Then 

     instance._internaValue = DateTime.Today 
    Else 

     instance._internaValue = Convert.ToDateTime(rightSide) 
    End If 

    Return instance 
End Operator 

Public Overrides Function ToString() As String 
    Return Me 
End Function 
Public Overloads Function ToString(format As String) As String 

    Return _internaValue.ToString(format) 
End Function 
End Class 

回答

0

XmlSerializer不使用類型轉換。只需使用sgen工具爲您的類型生成序列化程序集並通過Reflector瀏覽生成的代碼以瞭解其工作原理。

XmlSerializer實例化執行其構造函數的類,並稍後填充其可序列化屬性。

爲了確保您班級的班級正確序列化,請實施ISerializable界面。通過實施IXmlSerializable接口,您還可以更好地控制XML序列化過程。

+0

我用IXmlSerializable來實現自定義序列化,因爲我沒有公開的get/set屬性在我的對象中。非常感謝 – pluque