Почему я получаю исключение NullReferenceException при попытке создать XmlSerializer, используя очень простой тип с только строковыми свойствами? - PullRequest
0 голосов
/ 17 декабря 2018

У меня странная ошибка, которую я не совсем понимаю.У меня очень простой класс, в котором нет ничего, кроме string свойств и нескольких методов.Одним из таких методов является статическая функция, которая возвращает список объекта.Когда я пытаюсь создать экземпляр XmlSerializer с помощью type, я получаю InvalidOperationException с внутренним исключением NullReferenceException.Объявление свойств и класса выглядит следующим образом:

[Serializable]
public class Config
{
    public string Name { get; set; }       
    public string DatabaseInstanceName { get; set; }
    public string InitialCatalog { get; set; }
    public string PersistSecurityInfo { get; set; } = "true";
    public string UserID { get; set; }
    public string Password { internal get; set; }

    public Config() { } //declared explicitly in case this was the pitfall, but didn't work
    public void Save()....
    public SqlConnection GetConn()...
    public static IList<Config> LoadAllConfigurations...

Статическая функция, в которой происходит ошибка, не заходит далеко.

  public static IList<Config> LoadAllConfigurations()
    {
        var t = typeof(Config);
        var xml = new XmlSerializer(t); //error occurs here

Я подтвердил, что t содержит Type Config, так что с моей инстанцией я делаю неправильно?Как видите, я явно добавил конструктор без параметров, чтобы увидеть, есть ли здесь сбой, но ничего не изменилось.Обновление: я также попытался удалить значение по умолчанию для PersistSecurityInfo. InvalidOperationException Внешнее исключение говорит, что возникла проблема с отображением типа Config.

1 Ответ

0 голосов
/ 17 декабря 2018

steve16351 правильно, что именно модификатор internal в get вызывает это - код библиотеки не предвидит этот сценарий (что довольно редко, чтобы быть справедливым).

Не в этом случае , но иногда трюк с XmlSerializer состоит в том, чтобы развернуть все исключения, т.е.

    catch (Exception ex)
    {
        while (ex != null)
        {

            Console.WriteLine(ex.Message);
            ex = ex.InnerException;
        }
    }

Однако в этом случае все, что он говорит, это:

There was an error reflecting type 'Config'.
Object reference not set to an instance of an object.

Однако иногда этот подход дает более полезный объем информации о проблеме.

Но: удаление исправлений internal - это.Если вы на самом деле действительно не хотите, чтобы это свойство становилось доступным, то создайте две модели - одну для ваших доменных объектов для регулярного использования, а другую для типов сериализации просто дляиспользовать с сериализатором.Затем отобразите карту между ними рядом с вашим кодом сериализации.Этот подход является «единым магазином» для исправления всех нюансов сериализаторов, поскольку вы можете использовать все, что нравится сериализатору, без ущерба для ваших «настоящих» типов.

Также: вы можете удалить [Serializable]- XmlSerializer это не волнует.

...