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); } }
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());
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" />
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...
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; }
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(); }
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.