Какой атрибут мне нужно сохранить в RoamingSettings?

Какой атрибут мне нужно сохранить в RoamingSettings?

Например, когда я сериализую свои данные, ему нужны атрибуты DataContract и DataMember. Я могу сериализовать свой класс в XML, но мне нужно сохранить его с помощью RoamingSettings:

roamingSettings.Values["MyType"] = _mytype;

Во время отладки я получаю это сообщение об ошибке:

Данные этого типа не поддерживаются.
Информация WinRT: ошибка при попытке сериализовать значение для записи в хранилище данных приложения.

Наверное, мне нужен атрибут, но какой?


person kuzditomi    schedule 24.04.2012    source источник


Ответы (2)


Лучший способ справиться с этой ситуацией — сериализовать объект в строку и сохранить его.

Десериализовать сохраненное строковое значение в целевой объект.

person Cinchoo    schedule 24.04.2012
comment
да спасибо! однако я не могу найти асинхронный способ сделать это:/ - person kuzditomi; 24.04.2012

Используйте правильный ApplicationData.Current.RoamingFolder StorageFolder

public static class RoamingStorage<T> {

    public static async void SaveData(string filename, T data)
    {
        try
        {
            StorageFile file = await ApplicationData.Current.RoamingFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
            using (IRandomAccessStream raStream = await file.OpenAsync(FileAccessMode.ReadWrite))
            {
                using (IOutputStream outStream = raStream.GetOutputStreamAt(0))
                {
                    DataContractSerializer serializer = new DataContractSerializer(typeof(List<Item>));
                    serializer.WriteObject(outStream.AsStreamForWrite(), data);
                    await outStream.FlushAsync();
                }
            }
        }
        catch (Exception exc)
        {
            throw exc;
        }
    }

    public static async System.Threading.Tasks.Task<T> LoadData(string filename)
    {
        T data = default(T);
        try
        {
            StorageFile file = await ApplicationData.Current.RoamingFolder.GetFileAsync(filename);
            using (IInputStream inStream = await file.OpenSequentialReadAsync())
            {
               DataContractSerializer serializer = new DataContractSerializer(typeof(T));
               data = (T)serializer.ReadObject(inStream.AsStreamForRead());
            }
        }
        catch (FileNotFoundException ex)
        {
            throw ex;
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return data;
    }
}

пример вызова

RoamingStorage<List<Item>>.SaveData(FILENAME,Items);

List<Item> data = await RoamingStorage<List<Item>>.LoadData(FILENAME);
person rob    schedule 26.06.2012