Windows Phone Tips & Tricks. Cómo serializar un objeto a un fichero XML y deserializarlo

[Nota: Este artículo pertenece a la serie de Windows Phone Tips & Tricks de MSDN España]

Hola,

En mis apps para Windows Phone 7.5 uso una clase como la siguiente para serializar objetos a ficheros XML y deserializarlos después:

using System.IO;
using System.IO.IsolatedStorage;
using System.Xml.Serialization;

namespace MiApp.Services
{
    public class StorageService
    {
        // Constructor
        public StorageService()
        {
        }

        // Deserializa un objeto de un fichero
        public T Load<T>(string fileName)
        {
            // Accede al Isolated Storage
            using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (!myIsolatedStorage.FileExists(fileName))
                {
                    // El fichero no existe.
                    return default(T);
                }

                // El fichero existe. Abrelo
                using (IsolatedStorageFileStream stream = myIsolatedStorage.OpenFile(fileName, FileMode.Open))
                {
                    // Deserializa el contenido
                    XmlSerializer xml = new XmlSerializer(typeof(T));
                    T data = (T)xml.Deserialize(stream);
                    return data;
                }
            }
        }

        // Serializa un objeto a fichero
        public void Save<T>(string fileName, T data)
        {
            // Accede al Isolated Storage
            using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                // Crea un fichero para el contenido
                using (IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(fileName))
                {
                    // Serializa el objeto al fichero
                    XmlSerializer xml = new XmlSerializer(typeof(T));
                    xml.Serialize(fileStream, data);
                }
            }
        }
    }
}

Si quiero usar esta clase para serializar por ejemplo una ObservableCollection de objetos de tipo MyClass, lo hago así:

ObservableCollection<MyClass> myCollection;
...
StorageService.Save<ObservableCollection<MyClass>>("El nombre de mi fichero", myCollection);

Después para deserializar esa ObservableCollection lo hago así:

ObservableCollection<MyClass> myCollection = StorageService.Load<ObservableCollection<MyClass>>("El nombre de mi fichero");

Este código también funciona sin problemas en las apps de Windows Phone 8. Ahora, para Windows Phone 8 también podríamos utilizar una clase como la que uso en mis apps para Windows 8, que hace lo mismo pero de forma asíncrona y que tiene este aspecto:

using System;
using System.IO;
using System.Threading.Tasks;
using System.Xml.Serialization;
using Windows.Storage;

namespace MiApp.Services
{
    public class StorageServiceAsync
    {
        // Constructor
        public StorageServiceAsync()
        {

        }

        // Deserializa un objeto de un fichero
        public async Task<T> LoadAsync<T>(string fileName)
        {
            // Accede a la carpeta de la app
            StorageFolder localFolder = ApplicationData.Current.LocalFolder;

            try
            {
                // Accede al fichero
                StorageFile file = await localFolder.GetFileAsync(fileName);

                // Abrelo
                using (Stream stream = await file.OpenStreamForReadAsync())
                {
                    // Deserializa el contenido
                    XmlSerializer xml = new XmlSerializer(typeof(T));
                    T data = (T)xml.Deserialize(stream);
                    return data;
                }
            }
            catch (FileNotFoundException)
            {
                // El fichero no existe
                return default(T);
            }
        }

        // Serializa un objeto a fichero
        public async Task SaveAsync<T>(string fileName, T data)
        {
            // Accede a la carpeta de la app
            StorageFolder localFolder = ApplicationData.Current.LocalFolder;

            // Crea el fichero
            StorageFile viewModelFile = await localFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
            using (Stream stream = await viewModelFile.OpenStreamForWriteAsync())
            {
                // Serializa el objeto al fichero
                XmlSerializer xml = new XmlSerializer(typeof(T));
                xml.Serialize(stream, data);
            }
        }
    }
}

Para serializar una ObservableCollection como la anterior con esta otra clase lo hago así:

ObservableCollection<MyClass> myCollection;
...
await StorageServiceAsync.SaveAsync<ObservableCollection<MyClass>>("El nombre de mi fichero", myCollection);

Y para deserializarla así:

ObservableCollection<MyClass> myCollection = await StorageServiceAsync.LoadAsync<ObservableCollection<MyClass>>("El nombre de mi fichero");

Nota: si en la clase del objeto que estás serializando hay alguna propiedad que no quieras o puedas serializar, utiliza el atributo [XmlIgnore] para que no sea tenida en cuenta.

Espero que te sea de utilidad.

Un saludo,

Alejandro Campos Magencio (@alejacma)

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

About these ads

3 pensamientos en “Windows Phone Tips & Tricks. Cómo serializar un objeto a un fichero XML y deserializarlo

  1. Pingback: Tips & Tricks de desarrollo para Windows Phone - MSDN España - Site Home - MSDN Blogs

  2. Pingback: Windows Phone Tips & Tricks. Cómo serializar un objeto a un fichero JSON y deserializarlo | ¡Desarrolladores, desarrolladores, desarrolladores!

  3. Pingback: Windows Phone Tips & Tricks. Cómo actualizar el Live Tile principal de mi app | ¡Desarrolladores, desarrolladores, desarrolladores!

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s