Можно ли установить значение по умолчанию при десериализации xml в C # (.NET 3.5)? - PullRequest
3 голосов
/ 11 октября 2008

У меня есть небольшая проблема, которая немного расстраивает. Можно ли установить значение по умолчанию при десериализации xml в C # (.NET 3.5)? В основном я пытаюсь десериализовать некоторый XML, который не находится под моим контролем, и один элемент выглядит так:

<assignee-id type="integer">38628</assignee-id>

это также может выглядеть так:

<assignee-id type="integer" nil="true"></assignee-id>

Теперь в моем классе есть следующее свойство, которое должно получать данные:

[XmlElementAttribute("assignee-id")]
public int AssigneeId { get; set; }

Это нормально работает для первого примера элемента xml, но второй не работает. Я пытался изменить тип свойства на int? но это не помогает В какой-то момент мне нужно будет сериализовать его обратно в тот же формат xml, но я пытаюсь использовать встроенную поддержку сериализации, не прибегая к собственным.

Кто-нибудь имеет опыт работы с подобными проблемами?

Ответы [ 3 ]

3 голосов
/ 11 октября 2008

Похоже, ваш исходный XML использует xsi: type и xsi: nil, но не префиксирует их пространством имен.

Что вы можете сделать, это обработать их с помощью XSLT, чтобы превратить это:

<assignees>
  <assignee>
    <assignee-id type="integer">123456</assignee-id>
  </assignee>
  <assignee>
    <assignee-id type="integer" nil="true"></assignee-id>
  </assignee>
</assignees>

в это:

<assignees xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <assignee>
    <assignee-id xsi:type="integer">123456</assignee-id>
  </assignee>
  <assignee>
    <assignee-id xsi:type="integer" xsi:nil="true" />
  </assignee>
</assignees>

Это будет правильно обрабатываться XmlSerializer без необходимости какого-либо специального кода. XSLT для этого довольно тривиальное и забавное упражнение. Начните с одного из множества примеров "copy" XSLT и просто добавьте шаблон для атрибутов "type" и "nil", чтобы вывести атрибут пространства имен.

Если вы предпочитаете, вы можете загрузить XML-документ в память и изменить атрибуты, но это не очень хорошая идея, поскольку механизм XSLT настроен на производительность и может обрабатывать довольно большие файлы, не загружая их полностью в память.

2 голосов
/ 11 октября 2008

Возможно, вы захотите взглянуть на OnDeserializedAttribute , OnSerializingAttribute , OnSerializedAttribute и OnDeserializingAttribute , чтобы добавить пользовательскую логику в процесс сериализации

1 голос
/ 11 октября 2008

XmlSerializer использует xsi: nil - так что я ожидаю, что для этого вам нужно будет выполнить пользовательскую сериализацию IXmlSerializable. К сожалению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...