У меня есть класс, который может легко сериализоваться и десериализоваться после загрузки моего приложения WPF.Я сейчас пытаюсь добавить возможность загрузки проекта при запуске при передаче в файл проекта.К сожалению, он генерирует исключение InvalidOperationException, заявляющее:
There is an error in XML document (2, 2). ---> System.InvalidOperationException: <WeightingParametersBit xmlns=''> was not expected.
WeightingParametersBit
- это тип члена класса, который я пытаюсь сериализовать.Это в основном просто контейнер для словаря.Странно то, что файл не содержит тега для <WeightingParametersBit xmlns=....
в любом месте файла.Как только это исключение выдается, и приложение запускается.Если я нажимаю кнопку загрузки и выбираю тот же файл проекта, он прекрасно загружается.
Вот класс, который я пытаюсь сериализовать (класс малого контейнера):
public class WeightSettings
{
public double UserScoreSlagging;
public double UserScoreFouling;
public WeightMode BitWeightMode = WeightMode.Manual;
public WeightMode LigWeightMode = WeightMode.Manual;
public WeightingParametersBit BitWeights = new WeightingParametersBit();
public WeightingParametersLig LigWeights = new WeightingParametersLig();
}
Ивот XML-файл, который он генерирует (обрезает для просмотра):
<?xml version="1.0" encoding="utf-8"?>
<WeightSettings>
<UserScoreSlagging>0</UserScoreSlagging>
<UserScoreFouling>0</UserScoreFouling>
<BitWeightMode>Manual</BitWeightMode>
<LigWeightMode>Manual</LigWeightMode>
<BitWeights>
<bituminous>
...
</bituminous>
</BitWeights>
<LigWeights>
<lignitic>
...
</lignitic>
</LigWeights>
</WeightSettings>
Мой универсальный код сериализации:
public static void Serialize<T>(this T source, TextWriter writer)
{
// Don't serialize a null object
if (Object.ReferenceEquals(source, null))
{
throw new ArgumentException("Trying to serialize null object.", "source");
}
XmlSerializer s = new XmlSerializer(typeof(T));
s.Serialize(writer, source);
writer.WriteLine();
}
И десериализация кода:
public static T Deserialize<T>(this T source, TextReader reader)
{
XmlSerializer s = new XmlSerializer(typeof(T));
source = (T)s.Deserialize(reader);
return source;
}
Вызов deserialize происходит из свойства, называемого WeightSettings
(типа WeightSettings
), которое не равно нулю:
WeightSettings = WeightSettings.Deserialize(sr);
Как я могу исправить это поведение?Возможно, еще важнее: почему я вижу это поведение только в событии Window Loaded?