Десериализация пустого элемента как ноль - PullRequest
3 голосов
/ 07 марта 2012

Я десериализирую некоторый XML из старого приложения в объект в моем текущем приложении.Старый XML часто содержит пустые элементы (<SomeElement />), которые в настоящее время десериализуются как пустые строки ("").

Я согласен, что это наиболее подходящее поведение, но это незначительный раздражитель;Я бы предпочел, чтобы они были десериализованы как Nothing или в идеале игнорировались - эффект был бы таким же.

Есть ли способы игнорировать эти элементы?Или я могу сделать их десериализованными как Nothing?

ВЫВОД: Оба перечисленных решения имеют свои достоинства ...

Решение Аарона было бы идеальным, если бы я только что имелодно свойство проблемы - это одно исправление для одной проблемы.

Если существует несколько проблемных свойств, решение svick является предпочтительным.Реализация ISerializable включает в себя создание конструктора и метода GetObjectData с определенной обработкой для каждого свойства.

Мое решение: поскольку моя проблема связана только с некоторыми устаревшими файлами XML (которые со временем исчезнут), и поскольку String.IsNullOrEmpty включаетчтобы я проигнорировал проблему, я решил ничего не делать.Я не хочу дополнительных затрат на поддержание интерфейса ISerializable, если в этом нет необходимости, но во многих случаях это было бы хорошим решением, так что это мой выбранный ответ.

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Я не нашел другого простого способа сделать это.Но вы всегда можете реализовать 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 голос
/ 07 марта 2012

Насколько мне известно, нет, вы не можете десериализовать элемент в Nothing, если элемент существует в XML, потому что десериализатор распознает, что элемент существует и содержит пустую строку.

<SomeElement/>

- это то же самое, что и

<SomeElement></SomeElement>

Если вам нужно такое поведение, возможно, создайте свойство для вашей переменной, которое ничего не выдаст, если найдет пустую строку.

Public ReadOnly Property SomeElement() As String
    Get
        If SomeElementValue = "" Then
            Return Nothing
        Else
            Return SomeElementValue
        End If
    End Get
End Property
...