none
XML: Fehler beim Reflektieren des Typs RRS feed

  • Frage

  • Hallo. Ich wollte gerade eine Funktion schreiben, die 3 Listen (string) mit Daten füllt.

     public List<string> _html { get; set; }
     public List<string> _css { get; set; }
     public List<string> _js { get; set; }
    
     public Tags()
            {
                InitializeComponent();
                _html = new List<string>();
                _css = new List<string>();
                _js = new List<string>();
            }

    Dann beim Laden (erst kam auch hier ein Fehler):

    if (File.Exists(Path.Combine(io.pHTML, "Tags.xml")))
                    {
                        using (FileStream file = new FileStream(Path.Combine(io.pHTML, "Tags.xml"), FileMode.Open))
                        {
                            XmlSerializer ser = new XmlSerializer(typeof(Tags));
                            Tags tags = (Tags)ser.Deserialize(file);
                            _html = tags._html;
                        }
                    }

    Speichern:

    if (File.Exists(Path.Combine(io.pHTML, "Tags.xml")))
                    {
                        using (FileStream file = new FileStream(Path.Combine(io.pHTML, "Tags.xml"), FileMode.Open))
                        {
                            XmlSerializer ser = new XmlSerializer(typeof(Tags));
                            Tags tags = (Tags)ser.Deserialize(file);
                            _html = tags._html;
                        }
                    }
    
    using (FileStream file = new FileStream(_path, FileMode.Create))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(Tags));
                    serializer.Serialize(file, this);
                }

    Ich weiß nicht, wo hier der Fehler liegt. Vielleicht, dass der Konstruktor nicht leer ist? Aber als Fehler kommt: der Typ kann nicht replektiert werden.


    Freitag, 18. März 2016 21:59

Alle Antworten

  • Hi,

    poste doch mal deine XML Datei. Ohne die kann das alles und nichts sein.

    In der Regel steht aber in der InnerException drin, was beim Deserialisieren schiefgelaufen ist.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 19. März 2016 10:43
    Moderator
  • Die XML-Datei ist leer. Das ist das Problem, obwohl ich die Liste ja fülle.
    Samstag, 19. März 2016 10:45
  • Hi,

    hier mal eine nachgebaute Klasse, die den von dir gezeigten Aufbau hat:

    using System.IO;
    using System.Xml;
    using System.Xml.Serialization;
    using System.Collections.Generic;
    
    namespace MyNamespace
    {
        public class Tags
        {
         public List<string> _html { get; set; }
         public List<string> _css { get; set; }
         public List<string> _js { get; set; }
    
             public Tags()
            {
                //InitializeComponent();
                _html = new List<string>();
                _css = new List<string>();
                _js = new List<string>();
            }
    
            public void Load()
            {
                if( File.Exists( @"X:\Ordner\Tags.xml" ) )
                {
                    using ( FileStream file = new FileStream( @"X:\Ordner\Tags.xml", FileMode.Open ) )
                    {
                        XmlSerializer ser = new XmlSerializer( typeof( Tags ) );
                        Tags tags = (Tags)ser.Deserialize( file );
                        _html = tags._html;
                    }
                }
            }
    
            public void Save()
            {
    
                using ( FileStream file = new FileStream( @"X:\Ordner\Tags.xml", FileMode.Create ) )
                {
                XmlSerializer serializer = new XmlSerializer( typeof( Tags ) );
                serializer.Serialize( file, this );
                }
            }
        }
    }
    

    Die kann ich problemlos serialisieren und auch wieder deserialisieren.

    Tags tags = new Tags();
    tags.Save();
    tags.Load();

    Was mich stutzig macht, ist der Aufruf von InitializeComponent in deinem Code. Du hast doch hoffentlich nicht eine Form oder eine Control Klasse und willst die dann serialisieren? Falls doch, lass das. Erstell reine Datenklassen wie oben von mir gezeigt und serialisiere/deserialisiere die dann.

    Ansonsten poste bitte die exakte und vollständige Fehlermeldung, schau dir in der Exception bitte ex.Message und ex.StrackTrace an bzw. setz ein Try Catch Konstrukt um den Aufruf und poste dann ex.ToString().


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 19. März 2016 11:24
    Moderator
  • Doch. Ich habe versucht die Klasse einer Form zu serialisieren :(

    Jetzt habe ich jedoch für HTML eine extra Klasse geschrieben:

    public class HTML
        {
            public List<string> html { get; set; }
    
            public HTML()
            {
                html = new List<string>();
            }
    
            public void Speichern(string Pfad)
            {
                try
                {
                    using (FileStream file = new FileStream(Pfad, FileMode.Create))
                    {
                        XmlSerializer s = new XmlSerializer(typeof(HTML));
                        s.Serialize(file, this);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            public static HTML Laden(string Pfad)
            {
                try
                {
                    using (FileStream file = new FileStream(Pfad, FileMode.Open))
                    {
                        XmlSerializer s = new XmlSerializer(typeof(HTML));
                        return (HTML)s.Deserialize(file);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return null;
                }
            }
        }

    Und hier der Code der Form, die Daten in diese HTML-Klasse einspeisen soll:

    HTML _html;
    
            public Tags()
            {
                InitializeComponent();
                _html = HTML.Laden(Path.Combine(io.pHTML, "Tags.xml"));
            }
    _path = Path.Combine(io.pHTML, "Tags.xml");
                        _html.html.Add("Hallo");
    _html.Speichern(_path);

    Hier kommt aber bei _html.html.Add() ein Fehler: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Samstag, 19. März 2016 12:48

  • HTML _html;
    
            public Tags()
            {
                InitializeComponent();
                _html = HTML.Laden(Path.Combine(io.pHTML, "Tags.xml"));
            }
    _path = Path.Combine(io.pHTML, "Tags.xml");
                        _html.html.Add("Hallo");
    _html.Speichern(_path);

    Hier kommt aber bei _html.html.Add() ein Fehler: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    HTML.Laden wird keine Liste liefern (null), darum kommt Objektverweis erforderlich.

    Des weiteren kann man keine Windows-Control oder Klassen, die nicht mit [Serializable()] als Attribut versehen sind, weder serialisieren, noch deserialisieren.

    Man kann Felder/Egenschaften von der Serialisierung ausschließen, dazu bekommt das Feld / die Eigenschaft das Attribut: [XmlIgnoreAttribute()].

    Auch wenn diese Antwort etwas spät kommt, hoffe ich: Das andere Leute, die auf diesen Artikel stoßen, damit eine Lösung finden.

    Viele Grüße

    Henrik

    Montag, 30. April 2018 19:58