我正在将旧应用程序中的某些XML反序列化为当前应用程序中的对象。旧XML通常具有空元素(<SomeElement />
),这些元素当前被反序列化为空字符串(""
)。
我同意这是最合适的行为,但这是一种轻微的刺激;我宁愿将它们反序列化为Nothing
或理想地忽略 - 效果也是一样的。
有没有办法忽略这些元素?或者我可以将它们反序列化为Nothing
吗?
结论: 列出的两种解决方案都有其优点......
如果我只有一个问题属性,那么Aaron的解决方案将是理想的 - 对于一个问题,它只是一个修复。
如果存在多个有问题的属性,则首选svick解决方案。实现ISerializable包括创建一个构造函数和一个GetObjectData方法,并对每个属性进行特定处理。
我的决定:因为我的问题只涉及一些遗留的XML文件(随着时间的推移会消失),而且由于String.IsNullOrEmpty使我能够忽略这个问题,所以我决定什么都不做。如果没有必要,我不希望维护ISerializable接口的额外开销 - 但在许多情况下,这将是一个很好的解决方案,所以这是我选择的答案。
答案 0 :(得分:2)
我没有找到任何其他明确的简单方法来做到这一点。但是你总是可以实现IXmlSerializable
并自己处理序列化和反序列化:
Public Sub ReadXml(ByVal reader As XmlReader) Implements IXmlSerializable.ReadXml
reader.ReadStartElement()
If (reader.Name = "SomeElement") Then
Dim someElementValue = reader.ReadElementString()
If someElementValue <> String.Empty Then
SomeElement = someElementValue
End If
End If
reader.ReadEndElement()
End Sub
答案 1 :(得分:1)
据我所知,不,如果元素存在于XML中,则无法将元素反序列化为Nothing,因为反序列化器会识别该元素存在且包含空字符串。
<SomeElement/>
与:
相同<SomeElement></SomeElement>
如果您需要此行为,可能会为您的变量创建一个属性,如果它找到一个空字符串,则返回Nothing。
Public ReadOnly Property SomeElement() As String
Get
If SomeElementValue = "" Then
Return Nothing
Else
Return SomeElementValue
End If
End Get
End Property