Foros del Web » Programación para mayores de 30 ;) » .NET »

No me guarda archivos serializados correctamente

Estas en el tema de No me guarda archivos serializados correctamente en el foro de .NET en Foros del Web. Muy buenas, primeras de todo quiero presentarme puesto que hace un tiemppo que sigo el foro desde mi trabajo para ciertas dudas y hoy me ...
  #1 (permalink)  
Antiguo 24/11/2009, 05:27
 
Fecha de Ingreso: noviembre-2009
Mensajes: 3
Antigüedad: 14 años, 5 meses
Puntos: 0
No me guarda archivos serializados correctamente

Muy buenas, primeras de todo quiero presentarme puesto que hace un tiemppo que sigo el foro desde mi trabajo para ciertas dudas y hoy me he arrancado a plantear una duda existencial y cuya respuesta no he encontrado y la necesito para un proyecto de mi empresa.

Vereis, tengo un proyecto de informes. Este proyecto genera plantillas (una clase que no es más que ) sobre la cual insertas elementos(que son otras instancias de clases como un gráfico o una etiqueta).

El problema lo tengo al guardar plantillas. Es decir, una plantilla son una serie de elementos insertados. Pues mi idea fue en serializarlo todo y guardarlo para luego cargarlo. El problema viene en que cuando modificas añadiendo cosas funciona, pero si eliminas cosas que ya estaban cuando cargaste dicha plantilla no funciona. Lo más raro es que cuando añades algo para borrarlo si que lo deja borrado.

Os pongo fragmentos de codigo explicados para que os sea más facil de entender todo.
Código:
#1: Código de borrado de elementos(por si noatais algo raro)
 private void OnDeleteReportElement(object sender, RoutedEventArgs e)
        {
            if (CurrentDocument != null && CurrentDocument.ContentControl != null)
            //El current document es la plantilla actual
            {
                Canvas canvas = CurrentDocument.ContentControl.Content as Canvas;
                if (canvas != null)
                {
                    IReportElement re =       CurrentDocument.SelectionManager.SelectedElement;
                    if (re != null)
                    {
                        CurrentDocument.SelectionManager.ReportElements.Remove(re);
                        
                        canvas.Children.Remove(re.UserInterface);
                        
                       
                      
                    }
                    
                }
            }
        }



#2: Código de guardado

private void SaveTemplateCmdExecuted(object sender, ExecutedRoutedEventArgs e)
        {
            

            AnalyticalTestReport report = CurrentDocument as AnalyticalTestReport;
            //AnalyticalTestReport report es la plantilla con los elementos insertados
             if (report != null)
            {
                
                               
                SaveFileDialog dlg = new SaveFileDialog();
                dlg.AddExtension = true;
                dlg.OverwritePrompt = true;
                dlg.CreatePrompt = false;
                dlg.Filter = "XAML File (*.xaml)|*.xaml";
                
                if (dlg.ShowDialog() == true && !String.IsNullOrEmpty(dlg.FileName))
                {
                    
                    report.SaveTemplateTo(dlg.FileName);

                                      
                }
            }
        }

#3:El guardado mediante serialización

        public void SaveTemplateTo(string filename)
        {
            XElement templateXaml = CreateTemplateXaml();

            

            using (FileStream fstream = new FileStream(filename, FileMode.Create))
            {
                
                 using (XmlWriter writer = XmlWriter.Create(fstream, new XmlWriterSettings { Indent = true }))
                    {
                        
                    templateXaml.WriteTo(writer);
                }
            }
        }
Lo que he probado ha sido a borrar el archivo en donde guardo dicha plantilla para crearlo de nuevo y otras cosas que ahora no me acuerdo. Si pudierais ayudarme sería un detalle impagable.
Gracias.

Supongo que hasta mañana no pdré ver sus respuestas así que pido perdón por si contestan y no puedo contestar yo.

Última edición por spike_spiegel; 24/11/2009 a las 05:33 Razón: Otros
  #2 (permalink)  
Antiguo 24/11/2009, 15:08
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: No me guarda archivos serializados correctamente

en las pocas pruebas que hice con soap, el mismo serializaba el objeto como tal, si cambias los miembros de la clase el deserializador no lo podrá implementar de nuevo ya que el hash de comprobación cambia, tendrás que buscar otra alternativa a serializar que te permita almacenar la estructura de la clase.
  #3 (permalink)  
Antiguo 24/11/2009, 15:36
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: No me guarda archivos serializados correctamente

Haber si entendi estas generando tu reporte con xaml sin problemas y lo que haces es agregar o eliminar elementos visualmente sin problemas , el problema radica cuando estas salvando tu canvas que no esta considerando los cambios actuales si no solo adiciones.

Habra que ver tu codigo de CreateTemplateXaml() para ver como es que lo estas generando porque puede que no estes trabajando con la misma instancia u objeto (plantilla) cuando cargas como cuando editas o salvas.
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #4 (permalink)  
Antiguo 25/11/2009, 01:51
 
Fecha de Ingreso: noviembre-2009
Mensajes: 3
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: No me guarda archivos serializados correctamente

Exactamente me refería a eso PeterPay.
Pongo el codigo del createTemplate a ver si dais con el problema.
Muichas gracias de antemano, y creo que este problema se tendrá que ir resolviendo de día a día, porqué veo que la mayoría sois del otro lado del Atlántico (soy español).

Ahí va:
Código:
private XElement CreateTemplateXaml()
        {
            XElement newXaml = XElement.Parse(OriginalXaml.ToString());

            foreach (Control ctrl in GetChildControls<IReportElement>())
            {
                // find the existing XAML for the child control
                XElement element = (from el in newXaml.Descendants()
                                    from attr in el.Attributes()
                                    where attr.Name.LocalName.ToLower().Equals("uid") &&
                                          attr.Value.Equals(ctrl.Uid)
                                    select el).FirstOrDefault();

                var canvasXaml = newXaml.Descendants(TemplatesManager.WpfNamespace + "Canvas").FirstOrDefault();

                // if the control was added since the last save...
                // this assumes that the only way an element can be added is if it is Canvas-based
                if (element == null && ctrl is IReportElement)
                {
                    var reportElement = ctrl as IReportElement;
                    if (canvasXaml != null)
                    {
                        // create the XAML for the new control
                        element = new XElement(TemplatesManager.SdfLibraryNamespace + reportElement.GetType().Name);
                        element.Add(new XAttribute("Uid", ctrl.Uid));

                        // add the new XAML to a copy of the original XAML
                        canvasXaml.Add(element);
                    }
                }

                if (element != null)
                {
                    IReportElement re = ctrl as IReportElement;

                    // replace the existing properties
                    element.Descendants().Remove();
                    element.Add(re.XamlProperties);

                    // update all the attributes
                    foreach (XAttribute newAttr in re.CreateAttributes())
                    {
                        XAttribute oldAttr = (from attr in element.Attributes()
                                              where attr.Name == newAttr.Name
                                              select attr).FirstOrDefault();
                        if (oldAttr != null)
                            oldAttr.Remove();

                        element.Add(newAttr);


                    }
                }
            }

            return newXaml;
        }
Pues creo que es aquí donde falla todo, no recordaba como se hizo el código(he heredado el proyecto de otra persona así por las buenas y me viene grande en algunos aspectos)

Última edición por spike_spiegel; 25/11/2009 a las 02:04
  #5 (permalink)  
Antiguo 25/11/2009, 01:53
 
Fecha de Ingreso: noviembre-2009
Mensajes: 3
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: No me guarda archivos serializados correctamente

Cita:
Iniciado por maycolalvarez Ver Mensaje
en las pocas pruebas que hice con soap, el mismo serializaba el objeto como tal, si cambias los miembros de la clase el deserializador no lo podrá implementar de nuevo ya que el hash de comprobación cambia, tendrás que buscar otra alternativa a serializar que te permita almacenar la estructura de la clase.
El problema es que cuando añado elementos si que los añade correctamente, acabo de colocar el código de crear plantilla por si falla ahí tal y como dice Peterpay
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:04.