Avatar billede frostware Nybegynder
21. juni 2007 - 11:04 Der er 17 kommentarer og
1 løsning

Gemme ArrayList

Hej

Jeg har en ArrayList bArray, som jeg vil gemme i en form for fil når jeg trykker på en knap.

Og når jeg så åbner programmet igen skal jeg kunne kalde det gemte frem igen. Så jeg får en ArrayList magen til da jeg sidst gemte.

Måske det kan gøres med en xml fil? Ved ikke hvad der er smartest.
Avatar billede arne_v Ekspert
21. juni 2007 - 11:07 #1
Maaske serialize/deserialize til XML ?
Avatar billede frostware Nybegynder
21. juni 2007 - 11:12 #2
ja men kan du vise et eksempel på det. Noget man kan bygge lidt videre på.
Avatar billede arne_v Ekspert
21. juni 2007 - 11:20 #3
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 arne_v Ekspert
21. juni 2007 - 11:21 #4
OK - her er ArrayList saa gemt inde i et andet objekt, men der maa vaere lidt
inspiration !
Avatar billede frostware Nybegynder
21. juni 2007 - 11:41 #5
okay. Nu har jeg prøvet at ændre lidt i det. Min ArrayList består af en masse objekter som hedder backItem. Men det virker ikke. Er ikke helt med på det med serializer, måske det er der ved typeof det går galt. Jeg har lavet det her:

            XmlSerializer ser = new XmlSerializer(typeof(backupItem));
            StreamWriter sw = new StreamWriter("C:\\test.xml");
            for(int i = 0 ; i < listBox1.Items.Count;i++)
            {
                ser.Serialize(sw, bArray[i]);
            }
            sw.Close();

            StreamReader sr = new StreamReader("C:\\test.xml");
            backupItem tst2 = (backupItem)ser.Deserialize(sr);
            sr.Close();
            System.Console.WriteLine(tst2.getName());
Avatar billede arne_v Ekspert
21. juni 2007 - 11:43 #6
kan du uddybe "det virker ikke" ?
Avatar billede frostware Nybegynder
21. juni 2007 - 11:45 #7
altså den opretter xml filen, men når jeg henter den ind igen og prøver at udskrive det som burde være gemt sker der ingenting. I filen står der kun:
<?xml version="1.0" encoding="utf-8" ?>
  <backupItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
Avatar billede frostware Nybegynder
21. juni 2007 - 11:48 #8
Den giver også den her linie

Loaded 'v0psswbz', No symbols loaded.

siger ikke mig noget men kunne da se ud til at den ikke får noget input.
Avatar billede arne_v Ekspert
21. juni 2007 - 11:54 #9
Har backupItem public properties ?
Avatar billede frostware Nybegynder
21. juni 2007 - 11:55 #10
ja, har jeg lige sat på. Altså så den bare hedder public class backupItem.
Avatar billede arne_v Ekspert
21. juni 2007 - 12:30 #11
Proev og wrap din ArrayList i en anden klasse som i mit eksempel og saa serialiser/deserialiser
hele objektet.
Avatar billede frostware Nybegynder
21. juni 2007 - 13:00 #12
hvad vil det sige at wrap
Avatar billede arne_v Ekspert
21. juni 2007 - 14:02 #13
Ligesom min Test klasse i eksemplet ovenfor.
Avatar billede frostware Nybegynder
21. juni 2007 - 14:05 #14
Altså har lavet den her:
public class wrap
    {
        ArrayList list = new ArrayList();
        public wrap(ArrayList org)
        {
            list = (ArrayList)org.Clone();
        }
        public wrap()
        {
            list = (ArrayList)Form1.bArray.Clone();
        }
        public ArrayList getList()
        {
            return list;
        }
    }

Ved ikke om det er sådan det skal gøres. Man giver den en ArrayList og den opretter et nyt object.
Hvis det er sådan her, virker det stadig ikke...
Avatar billede frostware Nybegynder
21. juni 2007 - 14:13 #15
Og backupItem ser sådan her ud:
    public class backupItem
    {
        String name;
        String path;
        public backupItem()
        {
        }
        public backupItem(String nam, String pat)
        {
            name = nam;
            path = pat;
        }
        public String getName()
        {
            return name;
        }
        public String getPath()
        {
            return path;
        }
        public void setName(String nam)
        {
            name = nam;
        }
        public void setPath(String pat)
        {
            path = pat;
        }



    }
Avatar billede bauerdata Nybegynder
21. juni 2007 - 15:13 #16
#!/usr/bin/env python
import pickle

array = [1,2,3,4]
f = open( "gem.spam", "wb" )
pickle.dump( array, f )
f.close()

# så indlæsning
f = open( "gem.spam", "rb" )
array2 = pickle.load( f )
f.close()
print array
print array2

# python er nemt. python er sjovt.
Avatar billede frostware Nybegynder
21. juni 2007 - 15:20 #17
Så virker det! backupItem:
public class backupItem
    {
        public String name;
        public String path;
     
        public backupItem()
        {
        }
        public backupItem(String nam, String pat)
        {
            name = nam;
            path = pat;
        }
        public String getName()
        {
            return name;
        }
        public String getPath()
        {
            return path;
        }
        public void setName(String nam)
        {
            name = nam;
        }
        public void setPath(String pat)
        {
            path = pat;
        }
    }

Og den der wrapper den:
    [XmlInclude(typeof(backupItem))]
    public class wrap
    {
        public ArrayList list;
        public wrap(ArrayList org)
        {
            list = (ArrayList)org.Clone();
        }
        public wrap()
        {
            list = new ArrayList();
        }
        public ArrayList getList()
        {
            return list;
        }
    }

og til sidst koden der gemmer og åbner:
    public void SaveXml()
        {
            wrap save = new wrap(bArray);
            XmlSerializer ser = new XmlSerializer(save.GetType());
            StreamWriter sw = new StreamWriter("C:\\test.xml");
            ser.Serialize(sw, save);
            sw.Close();
        }

        public void OpenXml()
        {
            wrap open = new wrap();
            XmlSerializer ser = new XmlSerializer(open.GetType());
            StreamReader sr = new StreamReader("C:\\test.xml");
            open = (wrap)ser.Deserialize(sr);
            bArray = open.getList();
            sr.Close();
        }
Avatar billede arne_v Ekspert
23. juni 2007 - 19:56 #18
Så smider jeg et svar.
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