Десериализация вызывает InvalidOperationException при загрузке при запуске - PullRequest
1 голос
/ 26 октября 2010

У меня есть класс, который может легко сериализоваться и десериализоваться после загрузки моего приложения 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?

1 Ответ

0 голосов
/ 26 октября 2010

@ Джон Скит был на правильном пути.Я не менял текущий рабочий каталог до тех пор, пока мое приложение не было полностью загружено, поэтому он не мог найти файл.

Очень загадочное исключение, когда оно просто должно было быть FileNotFoundException

...