Bart Teunissen Bart Teunissen - 4 days ago 7
C# Question

Windows.Storage on WP8 gives me Deserialize exception

I'm trying to save an

ObservableCollection
using the new method in windows phone (Windows.Storage). I have the following class which is the base for my observable collection I want to save:

[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
}
}


My Code to save the observable collection is this:

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);
}
}


The Call of the Static
SaveCollection<t>
method:

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


in which Data is the collection which is based on the
settingsModel
. The call gives me an error on the last line of the
SaveCollection
method. The error of the dataserializer:


An exception of type 'System.Security.SecurityException' occurred in System.Runtime.Serialization.ni.dll but was not handled in user code

Additional information: The collection data contract type 'System.Collections.ObjectModel.ObservableCollection`1[[WP_ADS.Model.SettingsModel, WP_ADS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' cannot be deserialized because it does not have a public parameterless constructor. Adding a public parameterless constructor will fix this error. Alternatively, you can make it internal, and use the InternalsVisibleToAttribute attribute on your assembly in order to enable serialization of internal members - see documentation for more details. Be aware that doing so has certain security implications.


Any idea how to fix this?

(as the error suggests, I've already tried adding a parameterless constructor, making the constructor internal but both to no avail).

Answer

Don't forget to set your class to public.

Comments