Windows.Storage на WP8 дает мне исключение десериализации

Я пытаюсь спасти ObservableCollection используя новый метод в Windows Phone (Windows.Storage). У меня есть следующий класс, который является основой для моей наблюдаемой коллекции, которую я хочу сохранить:

    [DataContract]
    class SettingsModel : INotifyPropertyChanged
    {

        public SettingsModel()
        { }

        [DataMember]
        private string _TargetIP {get; set;}

        public string TargetIP
        {
            get 
            {
                return _TargetIP;
            }
            set
            {
                _TargetIP = value;
                NotifyPropertyChanged("TargetIP");
            }
        }

        [DataMember]
        private string _TargetADS { get; set; }

        public string TargetADS
        {
            get
            {
                return _TargetADS;
            }
            set
            {
                _TargetADS = value;
                NotifyPropertyChanged("TargetADS");
            }
        }

        [DataMember]
        private string _ClientIP { get; set; }

        public string ClientIP
        {
            get 
            {
                return _ClientIP;
            }
            set
            {
                _ClientIP = value;
                NotifyPropertyChanged("ClientIP");
            }
        }

        [DataMember]
        private string _ClientADS { get; set; }

        public string ClientADS
        {
            get 
            {
                return _ClientADS;
            }
            set
            {
                _ClientADS = value;
                NotifyPropertyChanged("ClientADS");
            }
        }

        #region Notify property changed
        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion
    }
}

Мой код для сохранения наблюдаемой коллекции:

    public static async void SaveCollection<T>(string FileName, string FileExtension, ObservableCollection<T> Col) where T : class
    {
        // place file extension
        FileName = FileName + "." + FileExtension;

        // creating the file and replace the current file if the file allready exists
        var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync
            (FileName, 
            Windows.Storage.CreationCollisionOption.ReplaceExisting);

        // openup a new stream to the file (write)
        using (var Stream = await file.OpenStreamForWriteAsync())
        {

            // serialize the observable collection to a writable type
            var DataSerializer = new DataContractSerializer(typeof(ObservableCollection<T>),
                new Type[] { typeof(T) });

            // write data
            DataSerializer.WriteObject(Stream, Col);
        }
    }

Зов статики SaveCollection<t> метод:

StorageHandler.SaveCollection<SettingsModel>("TestData", "txt", Data);

в котором данные являются коллекцией, которая основана на settingsModel, Вызов дает мне ошибку в последней строке SaveCollection метод. Ошибка анализатора данных:

Исключение типа "System.Security.SecurityException" возникло в System.Runtime.Serialization.ni.dll, но не было обработано в коде пользователя

Дополнительная информация: Тип контракта данных коллекции 'System.Collections.ObjectModel.ObservableCollection`1[[WP_ADS.Model.SettingsModel, WP_ADS, Version=1.0.0.0, Culture= нейтральный, PublicKeyToken=null]]' не может быть десериализован, поскольку не иметь публичного конструктора без параметров. Добавление открытого конструктора без параметров исправит эту ошибку. Кроме того, вы можете сделать его внутренним и использовать атрибут InternalsVisibleToAttribute в своей сборке, чтобы включить сериализацию внутренних элементов - см. Документацию для получения дополнительной информации. Имейте в виду, что это имеет определенные последствия для безопасности.

Есть идеи, как это исправить?

(как показывает ошибка, я уже пытался добавить конструктор без параметров, сделав его внутренним, но оба безрезультатно).

2 ответа

Решение

Не забудьте выставить свой класс на всеобщее обозрение.

Положить [DataMember] в государственной собственности

Другие вопросы по тегам