Serializacja czy własne metody odczytu/zapisu XML

0

Witam wszystkich !

Niezbyt umiem ogarnąć XMLReader-a by stworzyć sobie metodę ReadXml interfejsu XMLSerializable. Gdyż spotykam się najczęściej z przykładami obiektów z jednym polem .
Więc stworzyłem własny sposób zapisu i odczytu do/z XML.

Ale nie wiem czy taka metoda jest funkcjonalna patrząc na zastosowanie w przyszłości (poza tym że wstępnie funkcjonuje).

I prosiłbym o waszą opinie na ich temat .

Z góry dziękuje za opinie i poświęcony czas .

Nasz obiekt

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Biblioteczka
{
    using System;
    using System.Collections.Generic;
    using System.Xml.Serialization;
    using System.Xml.Schema;
    using System.Xml;
    using System.Linq;

    enum Pola
    {
        id_ksiazki,
        tytul,
        id_autor,
        id_wydawnictwo,
        id_kategoria,
        liczbastron,
        druk,
        pdf,
        mobi,
        epub,
        przeczytana
    };


    [Serializable]
    public partial class Ksiażka : IComparable<Ksiażka>
    {




        public int Id_ksiazki { get; set; }

        public string Tytuł { get; set; }

        public Nullable<short> Liczba_stron { get; set; }

        public Nullable<bool> Druk { get; set; }

        public Nullable<bool> Pdf { get; set; }

        public Nullable<bool> Mobi { get; set; }

        public Nullable<bool> Epub { get; set; }

        public Nullable<bool> Przeczytana { get; set; }


        public virtual Autor Autor { get; set; }

        public virtual Kategoria Kategoria { get; set; }

        public virtual Wydawnictwo Wydawnictwo { get; set; }


        public int CompareTo(Ksiażka jaka)
        {
            return this.Tytuł.CompareTo(jaka.Tytuł);
        }

        /////////////////////////////////////////////////////////////////////
        ////////////////////////Serializacja/////////////////////////////////
        /////////////////////////////////////////////////////////////////////

        public void WriteXml(XmlWriter writer, string[] nazwy)
        {
            writer.WriteStartElement("Książka");
            writer.WriteElementString(nazwy[(int)Pola.id_ksiazki], this.Id_ksiazki.ToString());
            writer.WriteElementString(nazwy[(int)Pola.tytul], this.Tytuł);
            writer.WriteElementString(nazwy[(int)Pola.id_autor], this.Autor == null ? "Brak" : this.Autor.Id_autor.ToString());
            writer.WriteElementString(nazwy[(int)Pola.id_wydawnictwo], this.Wydawnictwo == null ? "Brak" : this.Wydawnictwo.Id_wydawnictwo.ToString());
            writer.WriteElementString(nazwy[(int)Pola.id_kategoria], this.Kategoria == null ? "Brak" : this.Kategoria.Id_kategoria.ToString());
            writer.WriteElementString(nazwy[(int)Pola.liczbastron], this.Liczba_stron.ToString());
            writer.WriteElementString(nazwy[(int)Pola.druk], this.Druk == null ? false.ToString() : this.Druk.ToString());
            writer.WriteElementString(nazwy[(int)Pola.pdf], this.Pdf == null ? false.ToString() : this.Pdf.ToString());
            writer.WriteElementString(nazwy[(int)Pola.mobi], this.Mobi == null ? false.ToString() : this.Mobi.ToString());
            writer.WriteElementString(nazwy[(int)Pola.epub], this.Epub == null ? false.ToString() : this.Epub.ToString());
            writer.WriteElementString(nazwy[(int)Pola.przeczytana], this.Przeczytana == null ? false.ToString() : this.Przeczytana.ToString());
            writer.WriteEndElement();

        }

        public void ReadXml(XmlNode ksiazka, string[] nazwy)
        {
            using (biblioteczkaEntities polaczenie = new biblioteczkaEntities())
            {
                this.Id_ksiazki = Convert.ToInt32(ksiazka[nazwy[(int)Pola.id_ksiazki]].InnerText);
                this.Tytuł = ksiazka[nazwy[(int)Pola.tytul]].InnerText;
                string id_autor = ksiazka[nazwy[(int)Pola.id_autor]].InnerText;
                if (id_autor.CompareTo("Brak") != 0)
                {
                    int id = Convert.ToInt32(id_autor);
                    this.Autor = polaczenie.Autor.FirstOrDefault(k => k.Id_autor == id);
                }

                string id_wydawnictwo = ksiazka[nazwy[(int)Pola.id_wydawnictwo]].InnerText;

                if (id_wydawnictwo.CompareTo("Brak") != 0)
                {
                    int id = Convert.ToInt32(id_wydawnictwo);
                    this.Wydawnictwo = polaczenie.Wydawnictwo.FirstOrDefault(k => k.Id_wydawnictwo == id);
                }

                string id_kategoria = ksiazka[nazwy[(int)Pola.id_kategoria]].InnerText;

                if (id_kategoria.CompareTo("Brak") != 0)
                {
                    int id = Convert.ToInt32(id_kategoria);
                    this.Kategoria = polaczenie.Kategoria.FirstOrDefault(k => k.Id_kategoria == id);
                }

                this.Liczba_stron = (short?)Convert.ToInt32(ksiazka[nazwy[(int)Pola.liczbastron]].InnerText);

                this.Druk = Convert.ToBoolean(ksiazka[nazwy[(int)Pola.druk]].InnerText);
                this.Pdf = Convert.ToBoolean(ksiazka[nazwy[(int)Pola.pdf]].InnerText);
                this.Mobi = Convert.ToBoolean(ksiazka[nazwy[(int)Pola.mobi]].InnerText);
                this.Epub = Convert.ToBoolean(ksiazka[nazwy[(int)Pola.epub]].InnerText);
                this.Przeczytana = Convert.ToBoolean(ksiazka[nazwy[(int)Pola.przeczytana]].InnerText);

            }
        }

    }
}

 

Użycie metod ReadXML i WriteXML

private void serializacjaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string[] nazwy_serializacja = { "Id_ksiazki", "Tytuł", "Id_autor", "Id_wydawnictwo", "Id_kategoria", "Liczba_stron", "Druk", "Pdf", "Mobi", "Epub", "Przeczytana" };
            using (biblioteczkaEntities polaczenie = new biblioteczkaEntities())
            {
                try
                {
                   
                    //////////////////////////////////////////
                    //////////////odczyt//////////////////////
                    /////////////////////////////////////////

                    XmlDocument doc = new XmlDocument();
                    doc.Load("books.xml");
                    XmlNodeList lista = doc.GetElementsByTagName("Książka");

                    foreach (XmlNode book in lista)
                    {
                        Ksiażka ksiazka = new Ksiażka();
                        ksiazka.ReadXml(book, nazwy_serializacja);
                        MessageBox.Show(ksiazka.Tytuł + " " + ksiazka.Autor.ToString());
                    }

                    ///////////////////////////////////////////
                    //////////////zapisz//////////////////////
                    /////////////////////////////////////////

                    List<Ksiażka> ksiazki = polaczenie.Ksiażka.ToList();
                    XmlWriterSettings settings = new XmlWriterSettings();
                    settings.NewLineOnAttributes = true;
                    settings.Indent = true;
                    settings.IndentChars = ("\t");
                    settings.OmitXmlDeclaration = true;
                    using (XmlWriter writer = XmlWriter.Create("books.xml", settings))
                    {

                        writer.WriteStartDocument();
                        writer.WriteStartElement("Książki");
                        foreach (Ksiażka k in ksiazki)
                        {
                            k.WriteXml(writer, nazwy_serializacja);
                        }
                        writer.WriteEndElement();
                        writer.WriteEndDocument();
                    }

                }

                catch (Exception oException)
                {
                    MessageBox.Show(oException.Message);
                }
                
            }
        } 
0

Trudno powiedzieć, czy jest funkcjonalna, bo do serializacji raczej używa się gotowych metod niż pisze własne. ;)

0

A jak dla takiego obiektu napisać ReadXML bo z tym nie umiem sobie poradzić żeby wykorzystać interfejs XMLSerializable .
Gdyż nie umie sobie poradzić z wczytywaniem do obiektów pliku zapisanego za pomocą WriteXML.

0

a nie możesz użyć XElement?

0

Próbowałem z xmlNode ( chyba tak to się pisało na telefonie jestem i nie mam jak sprawdzić ) jako parametr zamiast xmlread ale nie przeszło kompilacji . http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.readxml.aspx

1 użytkowników online, w tym zalogowanych: 0, gości: 1