W jaki sposób zserialozować obiekt klasy, który posiada w sobie obiekt daty i obiekt innej klasy? Z typami referencyjnymi jest problem, bo zapisywanie typów prostych do xml i odczytywanie ich mi normalnie działa. Korzystam z takiej klasy pomocniczej:
internal static class ObjectSerializer<T>
{
public static string ToXml(T value)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
StringBuilder stringBuilder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings()
{
Indent = true,
OmitXmlDeclaration = true,
};
using (XmlWriter xmlWriter = XmlWriter.Create(stringBuilder, settings))
{
serializer.Serialize(xmlWriter, value);
}
return stringBuilder.ToString();
}
// Deserialize from xml
public static T FromXml(string xml)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
T value;
using (StringReader stringReader = new StringReader(xml))
{
object deserialized = serializer.Deserialize(stringReader);
value = (T)deserialized;
}
return value;
}
}
Funkcja zapisu wygląda tak, odczyt analogiczny:
protected async override void SaveState(Dictionary<String, Object> pageState)
{
try
{
string localDataRachunki = ObjectSerializer<ObservableCollection<Rachunek>>.ToXml(MainPage.Rachunki);
if (!string.IsNullOrEmpty(localDataRachunki))
{
StorageFile localFileRachunki = await ApplicationData.Current.LocalFolder.CreateFileAsync("localDataRachunki.xml", CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(localFileRachunki, localDataRachunki);
}
}
catch (Exception ex)
{
}
}