将空元素反序列化为null

时间:2012-03-07 14:32:19

标签: .net vb.net xml-serialization

我正在将旧应用程序中的某些XML反序列化为当前应用程序中的对象。旧XML通常具有空元素(<SomeElement />),这些元素当前被反序列化为空字符串("")。

我同意这是最合适的行为,但这是一种轻微的刺激;我宁愿将它们反序列化为Nothing或理想地忽略 - 效果也是一样的。

有没有办法忽略这些元素?或者我可以将它们反序列化为Nothing吗?

结论: 列出的两种解决方案都有其优点......

如果我只有一个问题属性,那么Aaron的解决方案将是理想的 - 对于一个问题,它只是一个修复。

如果存在多个有问题的属性,则首选svick解决方案。实现ISerializable包括创建一个构造函数和一个GetObjectData方法,并对每个属性进行特定处理。

我的决定:因为我的问题只涉及一些遗留的XML文件(随着时间的推移会消失),而且由于String.IsNullOrEmpty使我能够忽略这个问题,所以我决定什么都不做。如果没有必要,我不希望维护ISerializable接口的额外开销 - 但在许多情况下,这将是一个很好的解决方案,所以这是我选择的答案。

2 个答案:

答案 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