문제가 있습니다. serialize
사용자 지정 개체 를 나열 하려고하면 모든 정보가 누락됩니다.
내 직렬화 출력 :
<?xml version="1.0" ?>
- <ArrayOfCustomObject xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CustomObject />
<CustomObject />
<CustomObject />
</ArrayOfCustomObject>
내 직렬화 접근 방식을 보여주는 코드가 있습니다.
Dim xmlSerializer As New XmlSerializer(GetType(List(Of CustomObject )))
Using fileStrm As New StreamWriter("C:\Users\MyUser\Desktop\xmlTest.xml", FileMode.OpenOrCreate)
xmlSerializer.Serialize(fileStrm, objectsList)
End Using
CustomObject는 다음과 같습니다.
Imports System.Xml.Serialization
<XmlRootAttribute("SomeObject")>
Public Class CustomObject
Sub New()
End Sub
Sub New(ByVal someTable As DataTable, ByVal id As Integer, ByVal title As String)
_someTable = someTable
_title = title
_id = id
End Sub
Private _someTable As DataTable
Private _title As String
Private _id As Integer
<XmlAttribute("Title")>
Public ReadOnly Property Title As String
Get
Return _title
End Get
End Property
<XmlAttribute("Table")>
Public ReadOnly Property SomeTable As DataTable
Get
Return _someTable
End Get
End Property
<XmlAttribute("ID")>
Public ReadOnly Property ID As Integer
Get
Return _id
End Get
End Property
End Class
내 실수는 어디에 있습니까? (C #이 더 적절하다면 자유롭게 대답하십시오)
XmlSerializer
setter없이 속성을 무시합니다.
예를 들어 귀하의 경우이 속성은 무시됩니다.
<XmlAttribute("Table")>
Public ReadOnly Property SomeTable As DataTable
Get
Return _someTable
End Get
End Property
읽기 전용이기 때문에 : serializer는 양방향에서 작동하도록 설계되었으므로 나중에 역 직렬화 할 수없는 것을 직렬화하는 것은 의미가 없습니다 (관점 상).
속성을 무시하는 데는 여러 가지 이유가 있습니다 (자세한 내용은 MSDN 참조, 목록이 매우 길고 항상 명확하지는 않음). 유지하려는 경우 수행 할 수있는 작업 XmlSerializer
은 setter 메서드를 추가하거나 BinarySerializer
현재 개체로 전달 된 속성을 사용하여 deserialization을위한 특수 개체 (하는 것과 유사한 대리)를 만드는 것입니다 .
<XmlRootAttribute("SomeObject")>
Public Class CustomObjectSurrogate
Sub New()
' Uncomment this if you plan to support deserialization too
' _realObject = New CustomObject()
End Sub
Sub New(realObject As CustomObject)
_realObject = realObject
End Sub
Private _realObject As CustomObject
<XmlAttribute("Table")>
Public Property SomeTable As DataTable
Get
Return _realObject.SomeTable
End Get
Set(value As DataTable)
' Ignore, this is a dummy object for serialization
End Set
End Property
' More properties here
End Class
이를 통해 직렬화합니다 CustomObjectSurrogagte
( CustomObject
속성 에 액세스하기위한 얇은 래퍼에 지나지 않음 ). 이러한 방식으로 CustomObject
구현을 원하는만큼 깔끔하게 유지할 수 있습니다 .
물론 IXmlSerializable 인터페이스를 구현 하여 XmlSerializer
원하는 작업을 정확하게 수행 할 수 있지만 많은 작업이 필요할 수 있습니다 (특히 직렬화 된 인터페이스가 현재 개체 모델과 많이 다를 수있는 경우).
특히 (의 모든 더러운 작업없이 ) 다른 것을 직렬화 (그리고 결국 역 직렬화) 할 수 있기 때문에 ( 예를 들어 사전, 일반 컬렉션 및 날짜에 대해 생각하고 있습니다) surragte 솔루션을 좋아 합니다 IXmlSerializable
. 확인 CustomObjectSurrogate
중첩 클래스의 내부를 CustomObject
당신은 심지어위한 공공 세터가 필요하지 않습니다 CustomObject
속성을.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다