Может ли XmlSerializer десериализоваться в Nullable < int > ;?
-
08-07-2019 - |
Вопрос
Я хотел десериализовать XML-сообщение, содержащее элемент, который можно пометить nil = " true "
, в класс со свойством типа int?
. Единственный способ заставить его работать - это написать собственный тип NullableInt
, который реализует IXmlSerializable
. Есть ли лучший способ сделать это?
Я описал всю проблему и то, как я ее решил noreferrer "> в моем блоге .
Решение
Я думаю, вам нужно добавить префикс nil = " true " с пространством имен для десериализации XmlSerializer до нуля. Р>
<?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"/>
Другие советы
Мое исправление состоит в том, чтобы предварительно обработать узлы, исправляя все "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.
Исключительно ленивый способ сделать это. Он хрупок по ряду причин, но мой XML достаточно прост, чтобы гарантировать такое быстрое и грязное исправление.
xmlStr = Regex.Replace(xmlStr, "nil=\"true\"", "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"");