Итак, я использовал 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.
Я на правильном пути или есть лучший способ справиться с этим? Если этот подход верен, как связать префиксы с пространствами имен?