Может ли XmlSerializer десериализоваться в Nullable <int>? - PullRequest
8 голосов
/ 21 ноября 2008

Я хотел десериализовать XML-сообщение, содержащее элемент, который можно пометить nil="true", в класс со свойством типа int?. Единственный способ заставить его работать - написать свой собственный тип NullableInt, который реализует IXmlSerializable. Есть ли лучший способ сделать это?

Я написал полную проблему и способ ее решения в своем блоге .

Ответы [ 3 ]

6 голосов
/ 21 ноября 2008

Я думаю, что вам нужно добавить префикс nil = "true" к пространству имен, чтобы XmlSerializer мог десериализовать значение null.

MSDN на xsi: ноль

<?xml version="1.0" encoding="UTF-8"?>
<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="array">
  <entity>
    <id xsi:type="integer">1</id>
    <name>Foo</name>
    <parent-id xsi:type="integer" xsi:nil="true"/>
3 голосов
/ 17 октября 2009

Мое исправление заключается в предварительной обработке узлов, исправляя любые атрибуты "nil":

public static void FixNilAttributeName(this XmlNode @this)
{
    XmlAttribute nilAttribute = @this.Attributes["nil"];
    if (nilAttribute == null)
    {
        return;
    }

    XmlAttribute newNil = @this.OwnerDocument.CreateAttribute("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance");
    newNil.Value = nilAttribute.Value;
    @this.Attributes.Remove(nilAttribute);
    @this.Attributes.Append(newNil);
}

Я связываю это с рекурсивным поиском дочерних узлов, чтобы для любого данного XmlNode (или XmlDocument) я мог выполнить один вызов перед десериализацией. Если вы хотите сохранить исходную структуру в памяти неизменной, работайте с Clone () из XmlNode.

0 голосов
/ 29 января 2011

Исключительно ленивый способ сделать это. Он хрупок по ряду причин, но мой XML достаточно прост, чтобы гарантировать такое быстрое и грязное исправление.

xmlStr = Regex.Replace(xmlStr, "nil=\"true\"", "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"");
...