1

.net에서 XML 직렬화/직렬화 해제 작업을하고 있었고 직렬화/직렬화 해제 프로세스가 XML 조각의 특정 부분에만 적용되는 방법이 필요했습니다. 이것은 deserialization 과정 후에 XML의 일부분을 유지할 수 있도록하기 위해서입니다.특정 유형의 필드에서 사용자 정의 Xml 직렬화/직렬화 해제를 허용하는 문제

이렇게하려면 IXmlSerializable을 구현 한 새 클래스 (XmlLiteral)를 만든 다음 IXmlSerializable.ReadXml 및 IXmlSerializable.WriteXml 메서드를 처리하기위한 특정 코드를 작성하는 것이 가장 좋습니다.

이 예제에서는 직렬화에 대해 작동하지만 비 직렬화 프로세스 중에는 내 XmlLiteral 클래스를 여러 번 사용하는 데 실패합니다. 아래 예제에서 sTest1은 올바르게 채워지지만 sTest2와 sTest3은 비어 있습니다.

나는 다음 줄을 잘못 이해해야한다고 생각하지만 이유는 알 수 없다.

Private Sub ReadXml(ByVal reader As System.Xml.XmlReader) Implements IXmlSerializable.ReadXml 
     Dim StringType As String = "" 
     If reader.IsEmptyElement OrElse reader.Read() = False Then 
      Exit Sub 
     End If 
     _src = reader.ReadOuterXml() 
    End Sub 

전체 목록 : 약간 더되는 ReadXml 방법에 협력하여이 문제를 해결하기 위해 관리

Imports System 
Imports System.Xml.Serialization 
Imports System.Xml 
Imports System.IO 
Imports System.Text 

Public Class XmlLiteralExample 
    Inherits System.Web.UI.Page 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

     Dim MyObjectInstance As New MyObject 

     MyObjectInstance.aProperty = "MyValue" 
     MyObjectInstance.XmlLiteral1 = New XmlLiteral("<test1>Some Value</test1>") 
     MyObjectInstance.XmlLiteral2 = New XmlLiteral("<test2>Some Value</test2>") 
     MyObjectInstance.XmlLiteral3 = New XmlLiteral("<test3>Some Value</test3>") 

     ' quickly serialize the object to Xml 
     Dim sw As New StringWriter(New StringBuilder()) 
     Dim s As New XmlSerializer(MyObjectInstance.[GetType]()), xmlnsEmpty As New XmlSerializerNamespaces 
     xmlnsEmpty.Add("", "") 
     s.Serialize(sw, MyObjectInstance, xmlnsEmpty) 
     Dim XElement As XElement = XElement.Parse(sw.ToString()) 

     ' XElement reads as the following, so serialization works OK 
     '<MyObject> 
     ' <aProperty>MyValue</aProperty> 
     ' <XmlLiteral1> 
     ' <test1>Some Value</test1> 
     ' </XmlLiteral1> 
     ' <XmlLiteral2> 
     ' <test2>Some Value</test2> 
     ' </XmlLiteral2> 
     ' <XmlLiteral3> 
     ' <test3>Some Value</test3> 
     ' </XmlLiteral3> 
     '</MyObject> 

     ' quickly deserialize the object back to an instance of MyObjectInstance2 
     Dim MyObjectInstance2 As New MyObject 
     Dim xmlReader As XmlReader, x As XmlSerializer 
     xmlReader = XElement.CreateReader 
     x = New XmlSerializer(MyObjectInstance2.GetType()) 
     MyObjectInstance2 = x.Deserialize(xmlReader) 

     Dim sProperty As String = MyObjectInstance2.aProperty ' equal to "MyValue" 
     Dim sTest1 As String = MyObjectInstance2.XmlLiteral1.Text ' contains <test1>Some Value</test1> 
     Dim sTest2 As String = MyObjectInstance2.XmlLiteral2.Text ' is empty 
     Dim sTest3 As String = MyObjectInstance2.XmlLiteral3.Text ' is empty 

     ' sTest3 and sTest3 should be populated but are not? 

     xmlReader = Nothing 

    End Sub 

    Public Class MyObject 
     Private _aProperty As String 
     Private _XmlLiteral1 As XmlLiteral 
     Private _XmlLiteral2 As XmlLiteral 
     Private _XmlLiteral3 As XmlLiteral 

     Public Property aProperty As String 
      Get 
       Return _aProperty 
      End Get 
      Set(ByVal value As String) 
       _aProperty = value 
      End Set 
     End Property 

     Public Property XmlLiteral1 As XmlLiteral 
      Get 
       Return _XmlLiteral1 
      End Get 
      Set(ByVal value As XmlLiteral) 
       _XmlLiteral1 = value 
      End Set 
     End Property 

     Public Property XmlLiteral2 As XmlLiteral 
      Get 
       Return _XmlLiteral2 
      End Get 
      Set(ByVal value As XmlLiteral) 
       _XmlLiteral2 = value 
      End Set 
     End Property 

     Public Property XmlLiteral3 As XmlLiteral 
      Get 
       Return _XmlLiteral3 
      End Get 
      Set(ByVal value As XmlLiteral) 
       _XmlLiteral3 = value 
      End Set 
     End Property 

     Public Sub New() 
      _XmlLiteral1 = New XmlLiteral 
      _XmlLiteral2 = New XmlLiteral 
      _XmlLiteral3 = New XmlLiteral 
     End Sub 

    End Class 

    <System.Xml.Serialization.XmlRootAttribute(Namespace:="", IsNullable:=False)> _ 
    Public Class XmlLiteral 
     Implements IXmlSerializable 
     Private _src As String 

     Public Property Text() As String 
      Get 
       Return _src 
      End Get 
      Set(ByVal value As String) 
       _src = value 
      End Set 
     End Property 

     Public Sub New() 
      _src = "" 
     End Sub 

     Public Sub New(ByVal Text As String) 
      _src = Text 
     End Sub 

#Region "IXmlSerializable Members" 

     Private Function GetSchema() As System.Xml.Schema.XmlSchema Implements IXmlSerializable.GetSchema 
      Return Nothing 
     End Function 

     Private Sub ReadXml(ByVal reader As System.Xml.XmlReader) Implements IXmlSerializable.ReadXml 
      Dim StringType As String = "" 
      If reader.IsEmptyElement OrElse reader.Read() = False Then 
       Exit Sub 
      End If 
      _src = reader.ReadOuterXml() 
     End Sub 

     Private Sub WriteXml(ByVal writer As System.Xml.XmlWriter) Implements IXmlSerializable.WriteXml 
      writer.WriteRaw(_src) 
     End Sub 

#End Region 

    End Class 

End Class 

답변

1

. 더 많은 조사가 끝나면 reader.ReadEndElement()를 사용하여 ReadXml 메서드를 끝내서 다음 판독기가 올바르게 작동하는 것이 중요하다는 것을 알게되었습니다. 희망이 솔루션은 누군가를 도와줍니다!

Private Sub ReadXml(ByVal reader As System.Xml.XmlReader) Implements IXmlSerializable.ReadXml 
     If reader.IsEmptyElement OrElse reader.Read() = False Then 
      Exit Sub 
     End If 
     While reader.NodeType <> System.Xml.XmlNodeType.EndElement 
      _src = reader.ReadOuterXml 
     End While 
     reader.ReadEndElement() 
    End Sub