Avatar billede webcreator Nybegynder
13. maj 2005 - 09:29 Der er 11 kommentarer og
1 løsning

Serialisering af objekter i ArrayList til XML dokument

Hej Eksperter.

Jeg har fundet flg. artikel på Microsofts supporter site : http://support.microsoft.com/default.aspx?scid=kb;en-us;815813

Den viser hvordan man serialiserer et enkelt objekt. Jeg ønsker at kunne serialisere en hel collection af objekter (i en ArrayListe), og tillige smide XML'en ned i et XML dokument. Er der nogen der kan hjælpe mig med det? Fx er jeg ikke sikke på, om man blot kan angive ArrayListen som type (hvordan skal den i givet fald finde ud af, at der ligger person-objekter i ArrayListen?) - og hvordan får jeg det ned i en fil med fx XMLwriter (hvis det da er den jeg skal bruge).
Avatar billede webcreator Nybegynder
13. maj 2005 - 09:30 #1
- Skal måske lige tilføjes, at jeg skal bruge XMLfilen til at generere en Crystal Report (hvis det kan have nogen relevans).
Avatar billede webcreator Nybegynder
13. maj 2005 - 10:45 #2
Ok, jeg kan da lige starte med en smule kode selv. Jeg har fået flg. til at virke (med ét objekt) :

Test test = new Test();
test.test1 = 123;
test.test2 = 3723;
test.test3 = DateTime.Now;

XmlSerializer xmls = new XmlSerializer(test.GetType());

FileInfo file = new FileInfo("testing.xml");

StreamWriter writer = file.CreateText();

xmls.Serialize(writer, test);

writer.Close();

-----------------------------------------------------------

I min fil får jeg flg. output :

<?xml version="1.0" encoding="utf-8"?>
<Test xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <test3>2005-05-13T10:40:24.2740320+02:00</test3>
  <test1>123</test1>
  <test2>3723</test2>
</Test>


Det er jo helt fint. Nu er mit eneste problem, at jeg gerne vil kunne smide alle mine objekter i min ArrayListe (af typen Test) ned i mit XML dokument. Kan I hjælpe?
Avatar billede arne_v Ekspert
13. maj 2005 - 10:47 #3
eksempel:

using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Xml.Serialization;

public class X
{
    private int v;
    public X() : this(0)
    {
    }
    public X(int v)
    {
        this.v = v;
    }
    public int V
    {
        get
        {
            return v;
        }
        set
        {
            v = value;
        }
    }
    public override string ToString()
    {
        return v.ToString();
    }
}

[XmlInclude(typeof( X ))]
public class Test
{
    private ArrayList list;
    public Test()
    {
        list = new ArrayList();
    }
    public void Add(X x)
    {
        list.Add(x);
    }
    public ArrayList List
    {
        get
        {
            return list;
        }
        set
        {
            list = value;
        }
    }
    public override string ToString()
    {
        StringBuilder sb = new StringBuilder("");
        for(int i = 0; i < list.Count; i++)
        {
            sb.Append(list[i]);
        }
        return sb.ToString();
    }
}

class MainClass
{
    public static void Main(string[] args)
    {
        Test tst = new Test();
        tst.Add(new X(1));
        tst.Add(new X(2));
        tst.Add(new X(3));
        Console.WriteLine(tst);
        XmlSerializer ser = new XmlSerializer(typeof(Test));
        StreamWriter sw = new StreamWriter("C:\\test.xml");
        ser.Serialize(sw, tst);
        sw.Close();
        StreamReader sr = new StreamReader("C:\\test.xml");
        Test tst2 = (Test)ser.Deserialize(sr);
        sr.Close(); 
        Console.WriteLine(tst2);
    }
}
Avatar billede webcreator Nybegynder
13. maj 2005 - 12:39 #4
Kanon, mange tak Arne.
Jeg kiggede lidt på det, men så faldt det mig pludselig ind, at et Dataset har god support for serialisering til XML. Kunne det være et godt alternativ? Jeg tænkte på om man så kunne bygge en DataTable op med alle ens objekter, og via denne type returnere et DataSet vha. den indbyggede property af samme navn. Desværre ser det ikke ud til at være muligt, da 'DataSet' på 'DataTable' nok nærmere giver en reference til en eventuel datakilde. Men måske der findes en alternativ måde eller alternativ komponent, der nemt kan "konverteres" eller omformes til et dataset, således at serialiseringen nemt kan foretages.
Avatar billede webcreator Nybegynder
13. maj 2005 - 12:40 #5
Hvis det er helt hen i skoven, så er jeg glad for den løsning du gav før. Så må jeg prøve at implementere den. Jeg ville bare meget gerne slippe "nemt" om det, ved at bruge nogle af de .NET funktioner der er til stede :)
Avatar billede webcreator Nybegynder
13. maj 2005 - 12:42 #6
Nå, helt tilfældigt så jeg, at DataSet'et har en collection af tabels. Jeg tilføjede bare min egen table til denne collection, og serialiserede så DataSettet - og det virkede sørme :)
Avatar billede arne_v Ekspert
13. maj 2005 - 13:04 #7
Det er jo også en måde at gøre det på.

Alle veje fører til Rom.
Avatar billede webcreator Nybegynder
13. maj 2005 - 13:33 #8
Hehe, yep.
Smider du ikke et svar, arne? Du skal lige have dine points for din løsning. Den er rar at have til en anden gang.
Avatar billede arne_v Ekspert
13. maj 2005 - 18:28 #9
svar
Avatar billede webcreator Nybegynder
13. maj 2005 - 20:24 #10
Tak igen - hvis du kan overskue det, så må du også meget gerne tage et kig på det følgende spørgsmål - det driver mig til vanvid :)
http://eksperten.dk/spm/617631
Avatar billede arne_v Ekspert
13. maj 2005 - 20:27 #11
desværre er det noget grafisk GUI halløjsa - ikke lige min stærke side
Avatar billede webcreator Nybegynder
13. maj 2005 - 20:30 #12
Hehe, ok - men tak alligevel. Jeg er på nippet til at springe over i noget GDI :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester