#1 15. Juli 2013 Zuletzt bearbeitet: 15. Juli 2013 Eigene Klasse in File speichern und lesen hi, ich hab mir ne eigene Klasse geschrieben, die einige booleans und Strings speichert. diese werden zur laufzeit gesetzt und sollen dann in eine datei gespeichert werden. beim nächsten start soll die gespeicherte datei wieder eingelesen werden und die darin enthaltenen daten sollen wieder in meine klasse geschrieben werden. die Klasse in der die daten gespeichert werden: PHP: import java . io . Serializable ; public class Settings implements Serializable { booleans , strings etc .....} die methode zum speichern der klasse sieht so aus: PHP: private static void saveSettings () throws IOException { try{ //use buffering OutputStream file = new FileOutputStream ( "settings.ser" ); OutputStream buffer = new BufferedOutputStream ( file ); ObjectOutput output = new ObjectOutputStream ( buffer ); try{ output . writeObject ( settings ); } finally{ output . close (); } } catch( IOException ex ){ System . out . println ( "fehler" ); } } settings is dabei eine instanz der Settings Klasse. ich lasse sie mir nach dem speichern in die konsole ausgeben, die daten stehen auf jeden fall da drin. hier die methode zum laden der settings: PHP: private static void loadSettings () throws IOException , ClassNotFoundException { try{ //use buffering InputStream file = new FileInputStream ( "settings.ser" ); InputStream buffer = new BufferedInputStream ( file ); ObjectInput input = new ObjectInputStream ( buffer ); try{ //deserialize the List settings = ( Settings ) input . readObject (); System . out . println ( settings ); } finally{ input . close (); } } catch( ClassNotFoundException ex ){ System . out . println ( "Cannot perform input. Class not found." ); } catch( IOException ex ){ System . out . println ( "Cannot perform input." ); } } wenn ich mir danach die klasse ausgeben lasse, sind alle werte null bzw false. wenn vorher schon werte in der klasse vorhanden waren, werden diese nicht verändert. das einlesen der datei ändert also rein garnichts an meiner klasse^^ wo genau liegt der fehler? muss ich in der settings klasse noch irgendwas implementieren, damit die werte korrekt in die datei geschrieben werden? + Multi-Zitat Zitieren
#2 15. Juli 2013 AW: Eigene Klasse in File speichern und lesen also ich würde das schreiben so machen: PHP: private static void saveSettings () throws IOException { try{ OutputStream file = new FileOutputStream ( "settings.ser" ); ObjectOutput output = new ObjectOutputStream ( file ); try{ output . writeObject ( settings ); } finally{ output . flush (); output . close (); } } catch( IOException ex ){ System . out . println ( "fehler" ); } } Den Inputstream würde ich analog dazu erstellen: PHP: InputStream file = new FileInputStream ( "settings.ser" ); ObjectInput input = new ObjectInputStream ( file ); .... settings = ( Settings ) input . readObject (); das wirklich entscheidende ist wahrscheinlich der Aufruf von flush() + Multi-Zitat Zitieren
#3 15. Juli 2013 AW: Eigene Klasse in File speichern und lesen nope, hat sich leider nichts geändert. der inhalt der settings.ser ist auch nur ein einzeiler, mit 29 zeichen. kommt mir ein bisschen kurz vor. es stehen aber auch einige steuerzeichen o.ä. drin, gibts im notepadd++ ne möglichkeit sich das anders anzeigen zu lassen? + Multi-Zitat Zitieren
#4 15. Juli 2013 Zuletzt von einem Moderator bearbeitet: 14. April 2017 AW: Eigene Klasse in File speichern und lesen Dann liegt es nicht am schreiben / lesen an sich sondern an anderen sachen. Hier mal ein Test, den ich auf die schnelle zusammengetippt habe: Download: Test.rar | www.xup.in Bitte nicht auf den Programmierstil achten + Multi-Zitat Zitieren
#5 15. Juli 2013 Zuletzt von einem Moderator bearbeitet: 14. April 2017 AW: Eigene Klasse in File speichern und lesen braucht man die getter/setter methoden in der settings klasse, damit die settings.ser vernünftig geschrieben wird?? deine settings.ser sieht nämlich ganz anders und viel länger aus als meine^^ in deiner sind ja die einzelnen wertenamen noch rauszulesen, in meiner steht ganichts... oder dürfen die variablen in der settings klasse bestimmte modifikatoren nicht haben? meine sind public static, deine private edit an dem static wirds wohl iegen... + Multi-Zitat Zitieren
#6 15. Juli 2013 Zuletzt von einem Moderator bearbeitet: 14. April 2017 AW: Eigene Klasse in File speichern und lesen Nein brauchst du nicht. Hier das gleiche ohne getter/setter Download: Test.rar | www.xup.in Ansonsten kannst du mir deinen quellcode mal geben, dann kann ich dir vielleicht schneller helfen. (von mir aus auch per pm) richtig, static dürfen die nicht sein. Ich würde dann aus der Klasse ggf. ein Singleton machen und die Attribute dann auf private setzen. 1 Person gefällt das. + Multi-Zitat Zitieren
#7 15. Juli 2013 AW: Eigene Klasse in File speichern und lesen ja, ich habs jetz erstma so gelassen und nur das static rausgenommen. scheint zu laufen^^ + Multi-Zitat Zitieren
#8 15. Juli 2013 AW: Eigene Klasse in File speichern und lesen ja, ist aber echt kein guter stil + Multi-Zitat Zitieren
#9 15. Juli 2013 AW: Eigene Klasse in File speichern und lesen das stimmt allerdings, für private tools benutze ich aber keine design patterns o.ä. + Multi-Zitat Zitieren
#10 15. Juli 2013 AW: Eigene Klasse in File speichern und lesen Es ist doch logisch, dass die Dinger nicht statisch sein dürfen, wenn du eine >Instanz< einer Klasse aka Objekt serialisieren willst Elemente die als "private" deklariert sind werden in der Regel auch nicht serialisiert. Außerdem muss die entsprechende Klasse einen Standardkonstruktor (ohne Parameter) oder gar keinen haben, sonst gibt es Probleme mit der Reflection, wenn versucht wird das Ding zu serialisieren. Das hier könnte auch noch interessant sein: The Java serialization algorithm revealed | JavaWorld + Multi-Zitat Zitieren
#11 15. Juli 2013 AW: Eigene Klasse in File speichern und lesen Waren bei mir alle Hatte keinen Standardkonstruktor und einen eigenen. Und dennoch ging es ?( + Multi-Zitat Zitieren
#12 15. Juli 2013 Zuletzt bearbeitet: 15. Juli 2013 AW: Eigene Klasse in File speichern und lesen Java Serialization and need for a no-arg constructor Auch das De-serialisieren (Datei -> Objekt)? Darum geht es dabei ja. Der leere Konstruktor wird benötigt um eine leere Instanz zu erstellen die dann mit Leben gefüllt werden kann. Und private Felder sollten dann auch nicht mehr gefüllt werden werden können. Kann mir schwer vorstellen, dass sich da etwas geändert hat. Und falls doch würde mich brennend interessieren was die da machen + Multi-Zitat Zitieren
#13 15. Juli 2013 Zuletzt bearbeitet: 15. Juli 2013 AW: Eigene Klasse in File speichern und lesen Klaro ging das Also kannst dir ja gerne das Projekt laden, ich konnte mit dem geladenen objekt "arbeiten". hab zwar nur die daten ausgegeben, aber ich denke alles andere sollte auch funktionieren. Habe das (wenn ich mich richtig erinner) auch immer in der Form gemacht. Also inkl. private Attributen und ohne Standardkonstruktor (wobei ich mir dabei nicht ganz sicher bin) + Multi-Zitat Zitieren
#14 16. Juli 2013 Zuletzt bearbeitet: 16. Juli 2013 AW: Eigene Klasse in File speichern und lesen Alles was ich gesagt habe trifft zu. Allerdings nur dann, wenn man Objekte als XML (de)serialisieren will Code: import java.beans.XMLEncoder; [...] XMLEncoder xmlEncoder = new XMLEncoder(new FileOutputStream("TestEntity.xml")); xmlEncoder.writeObject(testEntity); Das würde mit deiner Datenstruktur nicht funktionieren. 1 Person gefällt das. + Multi-Zitat Zitieren
#15 16. Juli 2013 AW: Eigene Klasse in File speichern und lesen hm als xml is natürlich noch cooler als mit der .ser datei^^ garnich dran gedacht + Multi-Zitat Zitieren
#16 19. Juli 2013 AW: Eigene Klasse in File speichern und lesen Wenn du nur Key-Value-Pairs speichern willst würde sich auch einfach eine Property-Datei anbieten, ist super einfach und schnell gemacht: klick Da fällt das Serialisieren komplett weg, weil alles als String betrachtet wird. Musst halt nur beim Auslesen dann wieder alles casten. 1 Person gefällt das. + Multi-Zitat Zitieren
#17 20. Juli 2013 AW: Eigene Klasse in File speichern und lesen Ah, sehr praktisch! Wieder was gelernt 1 Person gefällt das. + Multi-Zitat Zitieren