Benutzer mit den meisten Antworten
Textdatei zur Variablen machen

Frage
-
Hi,
Ich habe folgendes Problem: Ich würde gerne eine Variable so speichern, dass sie beim nächsten öffnen noch den gleichen Wert hat. Also eigentlich soll es ein Spielstand werden, der gespeichert wird. Nun habe ich schon verzweifelt im Netz gesucht, und nichts passendes, für mich machbares gefunden. Nun habe ich versucht, die Variable (int sternchen) als Textdatei zu nutzen:
string sternchen = System.IO.File.ReadAllText(@"Pfad"); int sternchen0 = Convert.ToInt32(sternchen);
Wenn es eine einfachere Lösung gibt wäre das natürlich gut (bin ein Anfänger).
Antworten
-
Hi,
ich persönlich würde hier eine Klasse aufbauen, die deine Einstellungen beinhaltet und diese dann in eine (XML, ... ) Datei serialisieren. Beim Programmstart liest Du den Dateiinhalt, deserialisierst diesen und hast deine kompletten Einstellungen wieder zur Verfügung.
Die Settings Klasse könnte bspw. so aussehen:
using System.Xml; using System.Xml.Serialization; [Serializable()] public class Settings { public double Value1 { get; set; } public double Value2 { get; set; } }
Die Hilfsmethoden für Serialisierung/Deserialisierung sehen dann so aus:
using System.Linq; using System.Text; using System.Xml; using System.Xml.Serialization; using System.IO; public class Helper { public static string SerializeObject<T>( T DataObject ) { string Result = String.Empty; MemoryStream MemoryStream = new MemoryStream(); XmlTextWriter TextWriter = new XmlTextWriter( MemoryStream, Encoding.UTF8 ); TextWriter.Indentation = 4; TextWriter.IndentChar = ' '; TextWriter.Formatting = Formatting.Indented; XmlSerializer Serializer = new XmlSerializer( typeof(T), string.Empty ); XmlSerializerNamespaces XmlNamespace = new XmlSerializerNamespaces(); XmlNamespace.Add( string.Empty, string.Empty ); Serializer.Serialize( TextWriter, DataObject, XmlNamespace ); Result = Encoding.UTF8.GetString( MemoryStream.ToArray() ); TextWriter.Close(); MemoryStream.Close(); MemoryStream.Dispose(); return Result; } public static T DeserializeString<T>( string XmlContent ) { T Result = default(T); XmlSerializer Serializer = new XmlSerializer( typeof(T) ); StringReader StringReader = new StringReader( XmlContent ); Result = (T)Serializer.Deserialize(StringReader); StringReader.Close(); StringReader.Dispose(); return Result; } }
Und verwenden kannst Du die dann so:
// Lesen Settings mySettings = Helper.DeserializeString<Settings>( File.ReadAllText( "<PfadZurDatei>" ), Encoding.UTF8 ); ... // Schreiben File.WriteAllText( "<PfadZurDatei>", Helper.SerializeObject<Settings>( mySettings ), Encoding.UTF8 ); ...
Und ja, das kann man natürlich schöner schreiben, ist aber auch schon spät heute :)
"Einfacher" ist es auf den ersten Blick sicher nicht. Da Du die Helper Klasse aber nur bei dir einbinden musst und dann eine (fast) beliebig komplexe Struktur lediglich durch den Aufruf der beiden Methoden serialisieren/deserialisieren kannst, ist das für dein weiteres Vorgehen auf jeden Fall sinnvoller, als jeden Wert in eine eigene Datei zu schreiben.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Freitag, 1. August 2014 21:16
- Als Antwort markiert James000001 Sonntag, 3. August 2014 09:11
-
Hi,
die Fehlermeldung bedeutet, dass in keiner deiner Klassen eine static void Main(...) Methode vorhanden ist. Die braucht es aber, damit dein Programm starten kann.
Schau mal hier, da findest Du ein Beispiel für eine Klasse mit einer solchen Methode.
http://msdn.microsoft.com/de-de/library/acy3edy3.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert James000001 Sonntag, 3. August 2014 09:11
-
Hallo James,
das könnte sein :)
Ich weiß ja nicht, was Du schon alles in deinem Programm drin hast. Wenn es nicht viel ist, würde ich ein neues Projekt erstellen und die einzelnen Bestandteile dann dort wieder reinkopieren.
Ansonsten müsste man dein Projekt mal komplett sehen um zu schauen, was da wo wie fehlt.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert James000001 Sonntag, 3. August 2014 09:11
Alle Antworten
-
Hi,
ich persönlich würde hier eine Klasse aufbauen, die deine Einstellungen beinhaltet und diese dann in eine (XML, ... ) Datei serialisieren. Beim Programmstart liest Du den Dateiinhalt, deserialisierst diesen und hast deine kompletten Einstellungen wieder zur Verfügung.
Die Settings Klasse könnte bspw. so aussehen:
using System.Xml; using System.Xml.Serialization; [Serializable()] public class Settings { public double Value1 { get; set; } public double Value2 { get; set; } }
Die Hilfsmethoden für Serialisierung/Deserialisierung sehen dann so aus:
using System.Linq; using System.Text; using System.Xml; using System.Xml.Serialization; using System.IO; public class Helper { public static string SerializeObject<T>( T DataObject ) { string Result = String.Empty; MemoryStream MemoryStream = new MemoryStream(); XmlTextWriter TextWriter = new XmlTextWriter( MemoryStream, Encoding.UTF8 ); TextWriter.Indentation = 4; TextWriter.IndentChar = ' '; TextWriter.Formatting = Formatting.Indented; XmlSerializer Serializer = new XmlSerializer( typeof(T), string.Empty ); XmlSerializerNamespaces XmlNamespace = new XmlSerializerNamespaces(); XmlNamespace.Add( string.Empty, string.Empty ); Serializer.Serialize( TextWriter, DataObject, XmlNamespace ); Result = Encoding.UTF8.GetString( MemoryStream.ToArray() ); TextWriter.Close(); MemoryStream.Close(); MemoryStream.Dispose(); return Result; } public static T DeserializeString<T>( string XmlContent ) { T Result = default(T); XmlSerializer Serializer = new XmlSerializer( typeof(T) ); StringReader StringReader = new StringReader( XmlContent ); Result = (T)Serializer.Deserialize(StringReader); StringReader.Close(); StringReader.Dispose(); return Result; } }
Und verwenden kannst Du die dann so:
// Lesen Settings mySettings = Helper.DeserializeString<Settings>( File.ReadAllText( "<PfadZurDatei>" ), Encoding.UTF8 ); ... // Schreiben File.WriteAllText( "<PfadZurDatei>", Helper.SerializeObject<Settings>( mySettings ), Encoding.UTF8 ); ...
Und ja, das kann man natürlich schöner schreiben, ist aber auch schon spät heute :)
"Einfacher" ist es auf den ersten Blick sicher nicht. Da Du die Helper Klasse aber nur bei dir einbinden musst und dann eine (fast) beliebig komplexe Struktur lediglich durch den Aufruf der beiden Methoden serialisieren/deserialisieren kannst, ist das für dein weiteres Vorgehen auf jeden Fall sinnvoller, als jeden Wert in eine eigene Datei zu schreiben.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Freitag, 1. August 2014 21:16
- Als Antwort markiert James000001 Sonntag, 3. August 2014 09:11
-
Vielen Dank für die Antwort. Nun habe ich versucht, die Lösung anzuwenden, bekam jedoch einige Fehlermeldungen. Nachdem ich nun im Web nach weitern Lösungen gesucht habe funktioniert mein ganzes Programm nicht mehr. Ich bekomme folgende Fehlermeldung:
Fehler 1 Das Programm 'Pfad... .exe' enthält keine als Einstiegspunkt geeignete statische Main-Methode. (Betrifft die Datei "CSC")
Wäre toll wenn mir jemand weiterhelfen könnte.
- Bearbeitet James000001 Samstag, 2. August 2014 15:37
-
Hi,
die Fehlermeldung bedeutet, dass in keiner deiner Klassen eine static void Main(...) Methode vorhanden ist. Die braucht es aber, damit dein Programm starten kann.
Schau mal hier, da findest Du ein Beispiel für eine Klasse mit einer solchen Methode.
http://msdn.microsoft.com/de-de/library/acy3edy3.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert James000001 Sonntag, 3. August 2014 09:11
-
Hallo James,
das könnte sein :)
Ich weiß ja nicht, was Du schon alles in deinem Programm drin hast. Wenn es nicht viel ist, würde ich ein neues Projekt erstellen und die einzelnen Bestandteile dann dort wieder reinkopieren.
Ansonsten müsste man dein Projekt mal komplett sehen um zu schauen, was da wo wie fehlt.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert James000001 Sonntag, 3. August 2014 09:11
-
So, ich habe nun mein Programm nocheinmal neu gemacht und die Variable als "Einstellung" gespeichert. Es funktioniert. Dauerhaft ist das sicherlich keine Lösung, aber ansonsten komme ich überhaupt nicht mehr mit. Wenn ich dann ein wenig mehr Erfahrung habe, werde ich mich mal an die anderen Lösungen wagen. Vielen für die Hilfe, Stefan Falz.