NullReferenceException



  • Hallo zusammen,

    ich habe ein Problem mit C#. Und zwar bekomme ich eine NullReferenceException, obwohl ich (soweit ich das richtig sehe) überall richtige Referenzen habe. In meinem Programm möchte ich Zitate in Objekten speichern und dann serialisieren. Könnt ihr mir weiterhelfen? Ich habe schon gegoogelt und mir Infos auf MSDN durchgelesen. Allerdings komme ich einfach nicht weiter.

    using System;
    using System.Net;
    using System.IO;
    using System.Xml.Serialization;
    using System.Collections;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ArrayListTester
    {
        class Program
        {
            public QuoteList Quotelist = new QuoteList("List der aktuellen Zitate");
    
            static void Main(string[] args)
            {
                Program prog = new Program();
                prog.tryAL();
            }
    
            public void tryAlTester()
            {
                this.addQuote2AL("Test", "TestTestTest");
                this.addQuote2AL("Test2", "Test2Test2Test2");
                this.checkAL();
            }
    
            public void addQuote2Al(string author, string content)
            {
                Quote Quotes = new Quote(author, content);
                Quotelist.Quote.Add(Quotes); // Hier gibt es die Exception -> Der Objektverweis 
                                             // wurde nicht auf eine Objektinstanz festgelegt.
            }
    
            public void checkAl()
            {
                XmlSerializer serializer = new XmlSerializer(typeof(QuoteList));
                FileStream fs = new FileStream("C:\\data.xml", FileMode.Create);
                serializer.Serialize(fs, Quotelist);
                Console.WriteLine("Daten serialisiert!");
                Console.Read();
            }
        }
    
        public class QuoteList
        {
            [XmlElement("listidentifier")]
            public string Listidentifier;
            [XmlArray("Quotearray")]
            [XmlArrayItem("Quoteobject")]
            public ArrayList Quote;
    
            public QuoteList() { }
            public QuoteList(string identifier)
            {
                this.Listidentifier = identifier;
            }
        }
    
        public class Quote
        {
            [XmlElement("author")]
            public string Author;
            [XmlElement("content")]
            public string Content;
    
            public Quote() { }
            public Quote(string author, string content)
            {
                this.Author     = author;
                this.Content    = content;
            }
        }
    }
    

    Danke für eure Bemühungen. Viele Grüße, der Gast :xmas1:



  • public class QuoteList 
        { 
            [XmlElement("listidentifier")] 
            public string Listidentifier; 
            [XmlArray("Quotearray")] 
            [XmlArrayItem("Quoteobject")] 
            public ArrayList Quote = new ArrayList(); // Instanz erzeugen !!
    
            public QuoteList() { } 
            public QuoteList(string identifier) 
            { 
                this.Listidentifier = identifier; 
            } 
        }
    

    Die Quote Referenz muss auf eine gültige ArrayList Instanz zeigen.
    Simon



  • Hey!

    Vielen Dank für deine Antwort! Das klappt jetzt wunderbar. Allerdings gibt es jetzt ein Problem mit dem Erstellen der XML-Datei. Hier nochmal der Code, weil ich gesehen habe, dass im Code des ersten Postings sich ein paar Schreibfehler sich eingeschlichen haben.

    using System;
    using System.Net;
    using System.IO;
    using System.Xml.Serialization;
    using System.Collections;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ArrayListTester
    {
        class Program
        {
            public QuoteList Quotelist = new QuoteList("List der aktuellen Zitate");
    
            static void Main(string[] args)
            {
                Program prog = new Program();
                prog.tryAL();
            }
    
            public void tryAL()
            {
                this.addQuote2AL("Test", "TestTestTest");
                this.addQuote2AL("Test2", "Test2Test2Test2");
                this.checkAL();
            }
    
            public void addQuote2AL(string author, string content)
            {
                Quote Quotes = new Quote(author, content);
                Quotelist.Quote.Add(Quotes);
            }
    
            public void checkAL()
            {
                XmlSerializer serializer = new XmlSerializer(typeof(QuoteList));
                FileStream fs = new FileStream("C:\\data.xml", FileMode.Create);
                serializer.Serialize(fs, Quotelist);   // Hier gibts die InvalidOperationException!!!
                Console.WriteLine("Daten serialisiert!");
                Console.Read();
            }
        }
    
        public class QuoteList
        {
            [XmlElement("listidentifier")]
            public string Listidentifier;
            [XmlArray("Quotearray")]
            [XmlArrayItem("Quoteobject")]
            public ArrayList Quote = new ArrayList();
    
            public QuoteList() { }
            public QuoteList(string identifier)
            {
                this.Listidentifier = identifier;
            }
        }
    
        public class Quote
        {
            [XmlElement("author")]
            public string Author;
            [XmlElement("content")]
            public string Content;
    
            public Quote() { }
            public Quote(string author, string content)
            {
                this.Author     = author;
                this.Content    = content;
            }
        }
    }
    

    Genau mit dem gleichen Code (für das Erstellen des XML-Dokuments) hat es bei mir schonmal geklappt. Warum es jetzt hier nicht funktioniert weiß ich nicht. Ich habe schon debuggt, aber die Werte der Variablen sehen eigentlich gut aus. Könntet ihr mir vlt. auf die Sprünge helfen?

    Vielen Dank und viele Grüße



  • MSDN schrieb:

    InvalidOperationException:
    An error occurred during serialization. The original exception is available using the InnerException property.

    Auf deutsch, schau mal in der InnerException-Eigenschaft der InvalidOperationException nach. Dort sollte genauer beschrieben sein, was den Fehler verursacht hat.



  • Hi!

    In der InnerException steht folgendes:

    {"Der Typ ArrayListTester.Quote wurde nicht erwartet. Verwenden Sie das XmlInclude- oder das SoapInclude-Attribut, um Typen anzugeben, die nicht statisch sind."}

    Danach habe ich auf MSDN gesucht und bin auf folgende Seite gestoßen: http://msdn2.microsoft.com/de-de/library/system.xml.serialization.xmlincludeattribute.xmlincludeattribute(vs.80).aspx

    Allerdings hat das mir nicht so viel weitergeholfen, da ich trotzdem nicht weiß, wie ich das Problem lösen kann. Ich habe einiges probiert, aber nichts hat so wirklich weitergeholfen.

    Könnt ihr mir sagen, wo das Problem ist? Aus der InnerException werde ich auch nicht schlau. Google konnte mir nicht weiterhelfen.

    Viele Grüße



  • Du verwendest in deiner Klasse QuoteListe den Typ ArrayList. In einer ArrayList kann jeder beliebige Variablentyp abgelegt werden (object). Der XmlSerializer erwartet also Werte vom Typ "Object". Du Lieferst ihm aber Werte vom Typ "Quote", diese hat er nicht erwartet und weiß nicht, wie er sie serialisieren soll. Daher löst er die von dir gepostete Exception aus.

    Um das Problem zu umgehen gibt es zwei mögliche Lösungen:

    1. Du verwendest statt ArrayList, List<Quote>. Es ist also eindeutig definiert, welchen Typ der XmlSerializer zu erwarteten hat.

    2. Du gibst dem, XmlSerializer weitere Typen an, mit denen er zu rechnen hat. Das müsste dann in etwa so aussehen:

    Statt

    public void checkAl()
    {
      XmlSerializer serializer = new XmlSerializer(typeof(QuoteList));
      ...
    }
    

    schreibst du

    public void checkAl()
    {
      XmlSerializer serializer = new XmlSerializer(typeof(QuoteList), new Type[] { typeof(Quote) });
      ...
    }
    

    Ich hoffe ich habe hier jetzt keinen Blödsinn verzapft, ist schon spät *schielt auf die Uhr*

    PS: Der Grund der Fehlermeldung, warum der XmlSerializer den Typ "Quote" nicht kennt liegt in der Vorgehensweise des Serializers, näheres dazu hat Onkel Google parat.



  • Hi, es sollte schon reichen, die Klasse 'Quote' mit dem 'SerializableAttribute' zu markieren – ungetestet!

    Unabhängig davon ist die Benutzung einer streng typisierten Liste natürlich besser (also 'List<Quote>' statt 'ArrayList').



  • Hallo!

    Vielen Dank! Jetzt funktioniert es wunderbar und ich hab sogar noch n bisschne was gelernt ;-))

    Finde cool, dass ihr auch Anfängerfragen beantwortet und man sich nicht unbedingt registrieren muss um hier zu posten!

    Danke nochmals, ciao


Anmelden zum Antworten