Настройка десериализации XML - PullRequest
0 голосов
/ 12 февраля 2020

Итак, я использовал DataContractSerializer для сохранения документов моего приложения на диск. Все типы, используемые классом Document, жили в одном пространстве имен, например:

namespace MyProjectVM
{
  class Document
  {
    public Apple[] Apples { get; set; }
    public Orange SelectedOrange { get; set; }
  }

  class Apple { ... }
  class Orange { ... }
}

Мой сериализатор выглядел так:

private static readonly Type[] AllObjectTypes = {
      typeof(Apple),
      typeof(Orange),
    };

private DataContractSerializer S = new DataContractSerializer(typeof(Document), AllObjectTypes, 0x7F_FFFF, false, true, null);

Все выглядело хорошо. Вещи хорошо сериализуются на диск, и я тоже могу их десериализовать.

Затем мне пришлось провести некоторый рефакторинг. Классы Apple и Orange были перемещены в новый проект (и, следовательно, в другое пространство имен). Это нарушило обратную совместимость, и старые документы больше не могут быть десериализованы. Я получаю всевозможные XML связанные с пространством имен ошибки этих перенесенных классов.

В настоящее время я пытаюсь решить эту проблему, перехватывая процесс десериализации, наследуя от XmlReader и возвращая пространство имен нового проекта для * Узлы 1016 * и Oranges, например:

public override string NamespaceURI
{
  get
  {
    if (reader.NodeType == XmlNodeType.Element)
    {
      switch (reader.Name)
      {
        case "Apples":
        case "Oranges":
          return "http://schemas.datacontract.org/2004/07/NewProject";

        default:
          return reader.NamespaceURI;
      }
    }
    else
      return inner.NamespaceURI;
  }
}

, но все равно не работает. Похоже, что мои пространства имен работают вместе с префиксами, и вот тут я полностью запутался. DataContractSerializer создает автоматические префиксы вида d1p3, d2p1 et c.

Я на правильном пути или есть лучший способ справиться с этим? Если этот подход верен, как связать префиксы с пространствами имен?

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