in

Serializar - Deserealizar un UserControl

Last post 03-04-2008 11:30 by srocac. 9 replies.
Page 1 of 1 (10 items)
Sort Posts: Previous Next
  • 02-20-2008 9:36

    • srocac
    • Top 10 Contributor
    • Joined on 04-25-2007
    • Posts 28
    • Points 414

    Serializar - Deserealizar un UserControl

    Buenas a todos,

    En  WPF tengo un usercontrol, llamado MyControl.xaml, y el MyControl.cs, lo tengo así:

    [Serializable]

    public partial class MyControl : System.Windows.Controls.UserControl,ISerializable

    {

    public MyControl()

    {

    InitializeComponent();

    }

    #region Miembros de ISerializable

    public void GetObjectData(SerializationInfo info, StreamingContext context)

    {

    //throw new Exception("The method or operation is not implemented.");

    }

    #endregion

    }

    Ejecuto el siguiente metodod 

    Cuando lo tengo serializado y guardado en un MemoryStream:

    //Serealizando

    IFormatter formatter = new BinaryFormatter();

    MyControl C = new MyControl();

    MemoryStream M = new MemoryStream();

    formatter.Serialize(M, C);

    //DeSerealizando

    IFormatter formatter = new BinaryFormatter();
    MemoryStream M2 = new MemoryStream();

    M.WriteTo(M2);

    M2.Seek(0, SeekOrigin.Begin); ; //Reseteamos para que vaya al principio

    MyControl c = (MyControl)formatter.Deserialize(M2);

    MyCanvas.children.add(c);

    Cuando voy a deserealizarlo me salta la siguiente excepcion:

    No se puede encontrar el constructor para deserializar un objeto de tipo 'PruebaSer.MyControl'.

    Este es un ejemplo, realmente guardo el objeto binario en un fichero, pero asi el codigo queda mas corto

    Alguien me puede decir como arregarlo. Creo que el ejemplo tambien se aplica a winforms con lo que le pongo un tag WPF

    Muchas gracias

    Filed under:
    • Post Points: 5
  • 02-20-2008 12:55 In reply to

    • srocac
    • Top 10 Contributor
    • Joined on 04-25-2007
    • Posts 28
    • Points 414

    Re: Serializar - Deserealizar un UserControl

    Buenas, ya esta solucionado.

    Basta con crear el constructor MyControl(SerializationInfo info, StreamingContext context) con estos parametros

     

    • Post Points: 22
  • 02-21-2008 11:23 In reply to

    • Chema
    • Top 25 Contributor
    • Joined on 03-08-2007
    • Posts 8
    • Points 142

    Re: Serializar - Deserealizar un UserControl

     

    Hola, en mi opinión creo que no te haría falta implementar la interfaz Iserializable, creo que con marcar la clase con el atributo ISerializableAttribute. En mi experiencia, en la mayoría con ese atributo y utilizando el atribute NonSerialized me ha subido suficiente para cubrir el 90% de los casos, implementar la interfaz Iserializable es añadir complejidad a algo que se puede solucionar con estos atributos o con la interfaz IdeserializationCallback o los atributos OnSerialized, OnSerializing, ...
    • Post Points: 22
  • 02-21-2008 11:59 In reply to

    • srocac
    • Top 10 Contributor
    • Joined on 04-25-2007
    • Posts 28
    • Points 414

    Re: Serializar - Deserealizar un UserControl

    Buenas

     Muchas Gracias por la contestación. Tienes razón que se le añade complejidad más que nada porque en estos metodos tienes que leer (en el caso del constructor) y escribir (en el caso del metodo de la interfaz)  a mano las propiedades que quieres guardar en la serializacion.

    Como no acabo de entender tu idea pero seguro que es buena, puedes cogerme el ejemplo por favor que he puesto y modificarmelo con tu solución

     Gracias

     Saludos

     

     

    • Post Points: 22
  • 02-21-2008 14:08 In reply to

    • Chema
    • Top 25 Contributor
    • Joined on 03-08-2007
    • Posts 8
    • Points 142

    Re: Serializar - Deserealizar un UserControl

    Yo digo que primero intentes serializarlo simplemente decorando el user control con el atribute ISerializable, si esto no funcionase significaría que hay algún field de la clase que no es serializable y habría que ver como solucionarlo. Simplemente, el consejo que te daba es que trates de hacerlo lo más sencillo posible y la implementación de la interfaz ISerializable me parece algo complicada para este caso.

    • Post Points: 22
  • 02-21-2008 14:22 In reply to

    • srocac
    • Top 10 Contributor
    • Joined on 04-25-2007
    • Posts 28
    • Points 414

    Re: Serializar - Deserealizar un UserControl

    Buenas

    Es lo que había hecho decorarlo en el atributo SERIALIZABLE . Así:

    [Serializable]

    public partial class MyControl : System.Windows.Controls.UserControl

    { ...}

    Pero al ejecutar la serialización, me salta la siguiente excepcion:

    El tipo 'System.Windows.Controls.UserControl' del ensamblado 'PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' no está marcado como serializable.

    por eso que he tenido que emplear la interfaz ISerializable.

    Sabes porque debe ser ??

    Un saludo 

     

     

     

    • Post Points: 22
  • 02-21-2008 15:36 In reply to

    • Chema
    • Top 25 Contributor
    • Joined on 03-08-2007
    • Posts 8
    • Points 142

    Re: Serializar - Deserealizar un UserControl

    Es verdad, tienes razón, he cogido el reflector y la clase UserControl no está marcada como Serializable, es por eso que no te deja serializar tu user control. Se me ocurre, que a lo mejor lo que podías hacer es montarte una clase con el estado de tu user control y serializar eso. Así cuando instanciases el user control, deserializarías esa clase con la cual podrías recupera el estado de ese user control.

    ¿Qué te parece?

    En breve, voy a empezar a desarrollar una aplicación de winforms y seguramente me enfrente a problemas similares, está puede ser una solución bastante limpia.

    • Post Points: 22
  • 02-28-2008 14:11 In reply to

    • srocac
    • Top 10 Contributor
    • Joined on 04-25-2007
    • Posts 28
    • Points 414

    Re: Serializar - Deserealizar un UserControl

    Creo que las prácticas me estan dejando sin neuronas por eso que he tardado en contestar, a que te refieres con:

    "Una clase con el estado de tu user control"

    Un saludo. 

     

     

    • Post Points: 22
  • 03-03-2008 14:20 In reply to

    • Chema
    • Top 25 Contributor
    • Joined on 03-08-2007
    • Posts 8
    • Points 142

    Re: Serializar - Deserealizar un UserControl

    Me refiero que te puedes crear una clase con las propiedades que te interesa inicializar del user control de esta manera deserializaría tu clase con el estado y se la pasaría a un metodo del user control que pillaría esta información. De esta manera minimizaría la información que necesitas serializar ya que es muy probable que solo necesites modificar un par de propiedades del user control.

    • Post Points: 22
  • 03-04-2008 11:30 In reply to

    • srocac
    • Top 10 Contributor
    • Joined on 04-25-2007
    • Posts 28
    • Points 414

    Re: Serializar - Deserealizar un UserControl

    Buenas

    Por lo que ido viendo estos días, aquellas clases que no se pueden serializar, les pones el atributo Serialize y luego implementas la interfaz. Si la interfaz el metodo GetDataObject, lo dejas en blanco te va a guardar un objeto vacío. Por lo que si queremos guardar las propiedades que luego modificaremos, podemos hacer lo que comentas de guardar las propiedades serializadas en una clase a parte o bien guardar las en el metodo GetDataObject.

    Como esto lo hago en WPF Y cada user control es un mundo parte, me es "más facil" implementar los métodos GetDataObject por que en cada uno guarda propiedades distintas,y a demás tengo los users controls cuyas propiedades son otros users controls, y  así por si solos se van llamando a los métodos GetDataObject.

    Pero la idea que has propuesto no esta nada mal. 

     

    • Post Points: 5
Page 1 of 1 (10 items)
Baleares on .NET®
Powered by Community Server (Commercial Edition), by Telligent Systems