проблема хранения списка объектов в изолированном хранилище - PullRequest
4 голосов
/ 22 февраля 2011

Я пытаюсь сохранить список объектов, которые я создал, в изолированном хранилище и иметь возможность отображать их в списке, автоматически генерируя для них заголовок.Пока что код работает, но как только я захлопываю приложение и запускаю его, все мои данные сохраняются, за исключением списка объектов.Я думаю, что моя проблема может быть в том, как я инициализирую список в первую очередь, или, возможно, в том, как я отображаю имена.Любая помощь приветствуется.

этот код находится в моем App.xaml.cs:

public partial class App : Application
    {
      public List<my_type> testList = new List<my_type>();

        void loadvalues()
        {
         IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
         List<my_Type> L;
         if (settings.TryGetValue<List<DrinkSesh>>("Storage", out L))
         { testList = L; }
        }

        void savevalues()
        {
        IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
        settings["Storage"] = testList;
        settings.Save();
        }
     }

Этот код находится на моей главной странице, чтобы добавить элементы в список:

(Application.Current as App).testList.Add(new my_type());

и этот код предназначен для реализации заголовков на экране на другой странице:

 public different_class()
{
        {
                InitializeComponent();
                for (i = 0; i < (Application.Current as App).testList.Count; i++)
                {
                    CreateATextBlock((Application.Current as    App).testList[i].Title_ToString(), i);
                }
        }

        private void CreateATextBlock(String title,int num)
        {
            testblockname = new TextBlock();
            testblockname.Text = (num + 1) + ". " + title;
            DrList.Children.Add(testblockname);
        }
}

Заранее спасибо!

Ответы [ 2 ]

7 голосов
/ 22 февраля 2011

Вот код, который я использую для сохранения и загрузки списков объектов из изолированного хранилища.

public class IsoStoreHelper
{
    private static IsolatedStorageFile _isoStore;
    public static IsolatedStorageFile IsoStore 
    { 
        get { return _isoStore ?? (_isoStore = IsolatedStorageFile.GetUserStoreForApplication()); }
    }

    public static void SaveList<T>(string folderName, string dataName, ObservableCollection<T> dataList) where T : class
    {
        if (!IsoStore.DirectoryExists(folderName))
        {
            IsoStore.CreateDirectory(folderName);
        }

        string fileStreamName = string.Format("{0}\\{1}.dat", folderName, dataName);

        using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileStreamName, FileMode.Create, IsoStore))
        {
            DataContractSerializer dcs = new DataContractSerializer(typeof(ObservableCollection<T>));
            dcs.WriteObject(stream, dataList);
        }
    }

    public static ObservableCollection<T> LoadList<T>(string folderName, string dataName) where T : class
    {
        ObservableCollection<T> retval = new ObservableCollection<T>();

        if (!IsoStore.DirectoryExists(folderName))
        {
            IsoStore.CreateDirectory(folderName);
        }

        string fileStreamName = string.Format("{0}\\{1}.dat", folderName, dataName);

        using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileStreamName, FileMode.OpenOrCreate, IsoStore))
        {
            if (stream.Length > 0)
            {
                DataContractSerializer dcs = new DataContractSerializer(typeof(ObservableCollection<T>));
                retval = dcs.ReadObject(stream) as ObservableCollection<T>;
            }
        }

        return retval;
    }
}
2 голосов
/ 22 февраля 2011

Просто добавляя свою коллекцию (List) к своим IsolatedStorageSettings, вы полагаетесь на встроенный сериализатор (DataContractSerializer) для сериализации вашего объекта для сохранения на диске.

Вы уверены, что ваш объект может быть правильно сериализовани десериализовано?

Возможно, это проще всего сделать самим.

Если вы делаете это сами, не так: - DataContractSerializer медленнее - DataContractJsonSerializer быстрее - Json.net быстрееТем не менее - двоичная сериализация выполняется быстрее.

При сериализации самостоятельно следует также сохранять в файле IsolatedStorageFile, чем в настройках.Это может помочь с производительностью, а также добавляет гибкости, которая может помочь отладке и тестированию.

...