Autor Beitrag
Luc0
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 17.02.10 17:16 
Hi Leute!

Ich bin leider ein XML Anfänger und versuche gerade, eine ArrayList zu serialisieren.

Die ArrayListe hält eine Menge von Job-Objekten, wobei jeder Job auch noch weitere Objekte hält, wie zB Category, Details usw..
Die Category, Details - Objekte haben nur properties (getter und setter).

Wenn ich jetzt nur die ArrayListe mit den Jobs serialisieren will, ohne das die Jobs weitere Objekte halten, funktioniert das. Aber sobald ich zB. wieder die Details einkommentiere, kommt wieder folgende Exception: "There was an error reflecting type 'JobList'."

Hier mal der Code:

Vielen vielen Dank im Vorraus!!! :/

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
 class MainTest
    {
         static void Main()
        {
            test();
          
        }

        public static void test()
        {
         


            JobList jobList = new JobList();
            jobList.addJob(new Job("hallo",2));
            jobList.addJob(new Job("tschö"3));
            XmlSerializer s = new XmlSerializer(typeof(JobList), new Type[] { typeof(JobDetails) });
            
            TextWriter w = new StreamWriter("./xml.xml");
            s.Serialize(w, jobList);
            w.Close();

            
        }
    }

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
 [XmlRoot("JobList")]
   public class JobList
    {
        [System.Xml.Serialization.XmlArray("Job")]
        [System.Xml.Serialization.XmlArrayItem("job"typeof(Job))]

        public ArrayList jobList;

        public JobList()
        {
            jobList = new ArrayList();

        }

        public void addJob(Job job)
        {
            jobList.Add(job);
        }

    }

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
 public  class Job
    {


      [XmlAttribute("jobDetails")] public JobDetails details { get; set; }
     //  [XmlAttribute("company")] public Company company { get; set; }
      // [XmlAttribute("person")] public Person person { get; set; }
       [XmlAttribute("id")] public int id { get; set; }
       [XmlAttribute("titel")] public string titel { get; set; }
       public Job(string titel, int id)
       {
           this.id = id;
           this.titel = titel;
           
       }

       public Job() { }
    }

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
 public class JobDetails
    {


      [XmlAttribute("categorie")] public string categorie { get; set; }
     [XmlAttribute("title")] public string title  { get; set; }
    //   [XmlAttribute("field")] public String field { get; set; }
    //   [XmlAttribute("description")] public String description { get; set; }
    //   [XmlAttribute("applicationDeadline")] public DateTime applicationDeadline { get; set; }
    //   [XmlAttribute("startDate")] public DateTime startDate { get; set; }

       public JobDetails()
       {
           
       }
       public JobDetails(string title)
       {
           this.title = title;
       }
    }
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 17.02.10 17:43 
Hallo und :welcome:,

die InnerException hilft dir manchmal auch. Ich vermute da steht dann sowas drin wie: "der typ xy kann nicht serialisiert werden".

Man kann durchaus Objekte mit Objekten serialisieren. Dabei muss aber beachtet werden, dass jedes der Objekte sozialisierbar ist.

ausblenden C#-Quelltext
1:
2:
3:
4:
    //   [XmlAttribute("field")] public String field { get; set; }
    //   [XmlAttribute("description")] public String description { get; set; }
    //   [XmlAttribute("applicationDeadline")] public DateTime applicationDeadline { get; set; }
    //   [XmlAttribute("startDate")] public DateTime startDate { get; set; }


Heißt bei field und Description geht es.. aber DateTime ist nicht serialisierbar.

Du kannst dir helfen indem du application Deadline und startDate beim xml serialisieren igonierst und dafür ein HilfVariable mit der String-representation des Datum verwendest.

Gruß Daniel
Luc0 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 17.02.10 18:31 
Hey!

Danke für die schnelle Antwort! Ich werde das dann später mal versuchen! :)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 17.02.10 19:34 
Ich habe mir mal die innerste Exception angeschaut:
Zitat:
{"Element 'details' vom Typ JobDetails kann nicht serialisiert werden. XmlAttribute/XmlText kann nicht zum Codieren von komplexen Typen verwendet werden."}

Und das macht auch Sinn, das kann wirklich nicht funktionieren :) . DateTime ist dagegen kein Problem, user profile icondanielf meint wahrscheinlich TimeSpan.

PS:
user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
sozialisierbar
:mrgreen:

_________________
>λ=
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 18.02.10 10:37 
Eigentlich meinte ich die Uri Klasse :o Mit dem Beispiel hatte ich es. DateTime war eine Vermutung.

Aber generell sollten alle Objekte sozialisierbar sein :D Dann wäre die Integration einfacher ;) geil geil :D
Luc0 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 18.02.10 14:34 
Hey ihr!

Also ich verstehe die innerste Exception ehrlich gesagt nicht, wieso sollte es denn dabei einen Fehler geben?
Wie kann ich denn meine Objektstruktur serializieren? Oder gibt es da keine Möglichkeit?

Bin für jede Hilfe dankbar :)

Bis dann,

Luc0
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 18.02.10 15:07 
Hi,

ich hab privat auch mal "komplexere" Objektstruktur mit dem XmlSerialiser serialisiert. Bei mir war nur ein Uri-Objekt das Problem, welches ich dann über einen String-Wrapper serialisiert habe. Deshalb habe ich mich gewundert, was bei dir überhaupt Falsch läuft. Da der Tipp mit dem DateTime daneben lag hab ich nun mal den Code bei mir geladen.

Ging tatsächlich am Anfang nicht. Dann hab ich sukzessive ein Objekt nach dem anderen für sich serialisiert und das ging. Also musste das Problem in Kombination mit der Struktur sein. Da es am JobDetails gehackt hat, hab ich mal das XmLAttribute entfernt und zack gings. Leider weiß ich nicht genau was dabei sein Problem war :nixweiss:

Aber Kha wird uns bestimmt die Theorie näher bringen ;)

Anmerkung:
Mit dem Attribute XmlElement geht es (anstatt XmlAttribute). Wahrscheinlich liegt das daran, dass er die Klasse JobDetails nicht als Attribut abbilden kann! (Edit: sagt ja auch mal wieder die Fehlermeldung: "XmlAttribute/XmlText kann nicht zum Codieren von komplexen Typen verwendet werden." - und Kha hatte (wie immer) den richtigen Riecher, bzw. kann Fehlermeldungen richtig lesen)


Gruß Daniel
Luc0 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 18.02.10 17:12 
Hey Daniel mein Retter!
Es funzt! Es war wirklicht nur das XmlElement... :)

Vielen vielen Dank :)


bis dann,

Luc0