Как сохранить массив определенного типа в моем файле настроек?

По какой-то причине я не могу сохранить массив своего класса в настройках. Вот код:

            var newLink = new Link();
            Properties.Settings.Default.Links = new ArrayList();
            Properties.Settings.Default.Links.Add(newLink);
            Properties.Settings.Default.Save();

В моем Settings.Designer.cs я указал поле как список массивов:

    [global::System.Configuration.UserScopedSettingAttribute()]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public global::System.Collections.ArrayList Links {
        get {
            return ((global::System.Collections.ArrayList)(this["Links"]));
        }
        set {
            this["Links"] = value;
        }
    }

По какой-то причине он не сохраняет данные, хотя класс Link является сериализуемым, и я его тестировал.


person ATL_DEV    schedule 03.05.2010    source источник
comment
Я не могу показаться Как ты это видишь? Выбрасывается ли исключение? Список пустой при загрузке? Пусто без перезагрузки?   -  person Foxfire    schedule 04.05.2010
comment
Список пуст, исключений нет. Почему-то он не сериализует мои ссылки.   -  person ATL_DEV    schedule 04.05.2010
comment
Содержатся ли данные в файле настроек (это файл XML, так что вы можете легко проверить)?   -  person Foxfire    schedule 04.05.2010
comment
Я проверил user.config и в массиве нет ссылок.   -  person ATL_DEV    schedule 04.05.2010
comment
Вот файл user.config: ‹?xml version=1.0 encoding=utf-8?› ‹configuration› ‹userSettings› ‹AdminTool.Properties.Settings› ‹setting name=Links serializeAs=Xml› ‹value /› ‹/setting› ‹/AdminTool.Properties.Settings› ‹/userSettings› ‹/configuration› Интересно, я пробовал писать массив целых чисел и все работало нормально. Интересно, что дает?   -  person ATL_DEV    schedule 04.05.2010


Ответы (2)


Я нашел источник проблемы. Простое использование простого массива не поможет. Подумав об этом, десериализатор не будет знать, к какому типу десериализовать элементы массива. Я не увидел, что массив требует строгой типизации. Дизайнер заставил меня по глупости поверить, что это простой общий массив:

    [global::System.Configuration.UserScopedSettingAttribute()]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public List<Link> Links
    {
        get {
            return ((List<Link>)(this["Links"]));
        }
        set {
            this["Links"] = value;
        }
    }

Мне пришлось вносить эти изменения в Settings.Designer.cs, а не из дизайнера.

person ATL_DEV    schedule 05.05.2010
comment
Спасибо, этот ответ просто очень помог мне! - person Evan; 07.10.2011

Убедитесь, что ваш класс Link либо правильно сериализуем XML, либо имеет преобразователь типов в строку (что предпочтительнее при использовании файлов application.settings).

Я бы предположил, что что-то в ваших типах не преобразуется в формат XML-сериализации. И ваш user.config показывает, что у него нет доступного преобразователя типов строк.

person Foxfire    schedule 04.05.2010