У меня была похожая проблема - клиенту нужен был XML от веб-сервиса со строками, обернутыми в ужасные теги CData, это совершенно не нужно, но они не хотели перекодировать своего клиента, поэтому мне пришлось привести свой XML в соответствие.
То, как я работал, состояло в том, чтобы заново набрать (строковые) свойства, которые я хотел отобразить как CDATA, для моего собственного пользовательского типа "XmlCDataString".
Затем я реализовал IXmlSerializable для этого типа и добавил пару перегрузок операторов сужения и расширения, чтобы свойства по-прежнему работали так же, как и строки.
Imports System.Xml.Serialization
Imports System.Xml
<Serializable()> _
Public Class XmlCDataString
Implements IXmlSerializable
Private _strValue As String = Nothing
Public Sub New()
End Sub
Public Sub New(ByVal strValue As String)
_strValue = strValue
End Sub
Public Property StringValue() As String
Get
Return _strValue
End Get
Set(ByVal value As String)
_strValue = value
End Set
End Property
Public Shared Widening Operator CType(ByVal strValue As String) As XmlCDataString
Return New XmlCDataString(strValue)
End Operator
Public Shared Narrowing Operator CType(ByVal cdata As XmlCDataString) As String
Return cdata.StringValue
End Operator
Public Function GetSchema() As System.Xml.Schema.XmlSchema Implements System.Xml.Serialization.IXmlSerializable.GetSchema
Throw New NotImplementedException
End Function
Public Sub ReadXml(ByVal reader As System.Xml.XmlReader) Implements System.Xml.Serialization.IXmlSerializable.ReadXml
' TODO
End Sub
Public Sub WriteXml(ByVal writer As System.Xml.XmlWriter) Implements System.Xml.Serialization.IXmlSerializable.WriteXml
Dim doc As XmlDocument
Dim xmlCData As XmlCDataSection
Dim serializer As XmlSerializer
doc = New XmlDataDocument()
xmlCData = doc.CreateCDataSection(_strValue)
serializer = New XmlSerializer(GetType(XmlCDataSection))
serializer.Serialize(writer, xmlCData)
End Sub
End Class
Свойства, которые я затем сериализую в CData, я должен перепечатать следующим образом (используя ваш пример):
Private _messageText As XmlCDataString
Public Property MessageText() As XmlCDataString
Get
Return _messageText
End Get
Set(ByVal value As XmlCDataString)
_messageText= value
End Set
End Property
Это сработало для меня!