24. april 2005 - 23:29Der er
23 kommentarer og 1 løsning
Persistens / gem og hent data
Hvordan laver man på enkel vis persistens i C#. Jeg har prøvet det i Java med serializable, og husker at man kunne gemme ens Model i en fil ret let. Hvad gør man i C#?
Det drejer sig om een collection klasse (AftaleBog) som indeholder en anden klasse (Aftale) og så er der to forms. Mere er der ikke :)
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
Jeg er mest til den sidste :) Det er vel min aftalebog, der skal gemmes? Kan du hjælpe med at putte det ind. Skal vi ikke lave en metode deri som gemmer, og en der henter ved opstart. Der er kun det her nu...
using System; using System.Collections;
namespace Calendar { public class AftaleBog { private ArrayList aftaler;
XmlSerializer ser = new XmlSerializer(typeof(Calendar.AftaleBog)); StreamWriter sw = new StreamWriter("aftalebog.xml"); ser.Serialize(sw, dinaftalebog); sw.Close();
og
XmlSerializer ser = new XmlSerializer(typeof(Calendar.AftaleBog)); StreamReader sr = new StreamReader("aftalebog.xml"); dinaftalebog = (Calendar.AftaleBog)ser.Deserialize(sr); sr.Close();
og så skal du lige finde ud af om den klasse serialiserer godt, men det finder du ud af med try and error metode
Ellers er det stilet nok. Kan du hjælpe med resten.
public KalenderForm(AftaleBog abog) { this.abog = abog; dato = new DateTime(); InitializeComponent(); monthCalendar1_DateChanged(null, null); XmlSerializer ser = new XmlSerializer(typeof(Calendar.AftaleBog)); StreamWriter sw = new StreamWriter("c:\\aftalebog.xml"); ser.Serialize(sw, abog); sw.Close(); }
------------
private void button5_Click(object sender, System.EventArgs e) { XmlSerializer ser = new XmlSerializer(typeof(Calendar.AftaleBog)); StreamWriter sw = new StreamWriter("c:\\aftalebog.xml"); ser.Serialize(sw, abog); sw.Close(); Dispose(); }
using System; using System.IO; using System.Text; using System.Collections; using System.Xml.Serialization;
public class Test { private ArrayList list; public Test() { list = new ArrayList(); } public void Add(string s) { list.Add(s); } 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("a"); tst.Add("bb"); tst.Add("ccc"); 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); } }
public class Test { private ArrayList list; // <---- private field ... public ArrayList List // <---- public property { get { return list; } set { list = value; } } ... }
Det begynder vist at hjælpe på det. Den prøver at loade, men siger der er fejl i xml dokumentet. Så slettede jeg det, og så sagde den det manglede, så oprettede jeg en tom tekstfil med filnavnet, og igen fejl i xml dokumentet.
System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Calendar.Aftale was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
Det er ved at være lidt langhåret. Men jeg vil gerne se det virke. Har du et bud på en løsning ? Jeg vil gerne sende filer, give max points og alt det der :) Jeg tror ikke det er særlig langt fra.
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); } }
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.