Serialisieren

feiste

Bekanntes Mitglied
Hallo,

ich versuche gerade 2 statische variablen
double punkte
und
String name

zu serialisieren und wieder deserialisieren
und dannach mit den beiden Variablen weiter zu arbeiten.
Nur leider bekomm ich das nicht ganz auf die reihe :/

Hier mal meine Ansätze:

Java:
 import java.io.*;
 import java.util.*;
 
 public class AUSLESEN
 {
   public static void main(String[] args) throws Exception
   {
     try {
     FileOutputStream fs = new FileOutputStream("test.ser");
       ObjectOutputStream os = new ObjectOutputStream(fs);
      
      os.writeDouble(SPIEL.punkte2);
      os.writeObject(GAMEWINDOW.name);
       os.close();
    } catch (IOException e) {
       System.err.println(e.toString());
     }
   }
 }

Java:
 import java.io.*;
 import java.util.*;
 
 public class EINLESEN
 { 
     public static double punkte3;
   
     public static void main(String[] args) throws Exception
   {
     try {
       FileInputStream fs = new FileInputStream("test.ser");
       ObjectInputStream os = new ObjectInputStream(fs);
     

	punkte3 = os.readDouble();
	String name = (String) os.readObject();
	System.out.println(punkte2);
	

	os.close();
     } catch (ClassNotFoundException e) {
       System.err.println(e.toString());
     } catch (IOException e) {
       System.err.println(e.toString());
     }
     
     
   }
 }

Java:
import java.io.Serializable;

public class SPIEL implements Serializable
{
public static punkte2;

public SPIEL()
{ ...... }
}


darf man statische variablen überhaupt serialisieren?
Und wie kann ich den Variablen der Klasse A
und sie statisch zu machen
in der Klasse B verwenden?

Danke !
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Nein. Weißt du eigendlich, was statisch bedeutet? (In Java)
Ich habe mal gelesen, dass es eventuell einen Weg gibt, hab das aber nicht weiter verfolgt.
 

feiste

Bekanntes Mitglied
achso deshalb funktioniert das nicht :)
aber sonst ist der code zum serialisieren in ordnung?

wie kann ich den dann, die variable x von der Klasse A
in der Klasse B verwenden
ohne sie statisch zu machen?
 

Volvagia

Top Contributor
Du erzeugst Instanzen mit new. Das sollte man sowieso fast immer machen, eine statische Methode macht nur selten Sinn, eigendlich sind fast immer nur Konstante statisch. ^^
 

Volvagia

Top Contributor
Java:
GameWindow gw = new GameWindow(); //Klassennamen bitte CamelCase.
gw.getName();

2 Dinge zum Code noch:
1. Wäre ein finally zum Schließen des Streams sauberer,
2. Gibt dir die toString-Methode bloß den Text und die Klasse der Exception zurück. Benutz lieber printStackTrace(), damit erhältst du die Zeilennummer und den Stack (Methodenaufrufe), sonst weißt du nicht, wo die Exception geflogen ist.
 

feiste

Bekanntes Mitglied
Java:
GameWindow gw = new GameWindow(); //Klassennamen bitte CamelCase.
gw.getName();

2 Dinge zum Code noch:
1. Wäre ein finally zum Schließen des Streams sauberer,
2. Gibt dir die toString-Methode bloß den Text und die Klasse der Exception zurück. Benutz lieber printStackTrace(), damit erhältst du die Zeilennummer und den Stack (Methodenaufrufe), sonst weißt du nicht, wo die Exception geflogen ist.

Name wäre in dem fall die variable oder?

okay danke !
 

Volvagia

Top Contributor
Du musst natürlich den Getter selbst noch in GameWindow schreiben:

Java:
private String name;
//
public String getName()
{
	return(name);
}
 

feiste

Bekanntes Mitglied
ok danke das funktioniert jetzt

aber wenn ich jetzt punkte3 in einer anderen Klasse weiterarbeiten will
ich mach ich dann das?

Fehlermeldung:
non static variable punkte3 cannot be referenced from a static context


Java:
 import java.io.*;
 import java.util.*;
 
 public class EINLESEN
 { 
     private double punkte3;
   
     public static void main(String[] args) throws Exception
   {
     try {
       FileInputStream fs = new FileInputStream("test.ser");
       ObjectInputStream os = new ObjectInputStream(fs);
     
 
    punkte3 = os.readDouble();
    String name = (String) os.readObject();
    System.out.println(punkte2);
    
 
    os.close();
     } catch (ClassNotFoundException e) {
       System.err.println(e.toString());
     } catch (IOException e) {
       System.err.println(e.toString());
     }
     
     
   }
 }
 

Volvagia

Top Contributor
Statische Methoden können natürlich nur auf statische Variablen zugreifen. Am Besten, du erzeugst eine Instanz von EINLESEN, und lässt ihm die Arbeit im Konstruktor erledigen.
 

feiste

Bekanntes Mitglied
so? =)

Java:
 import java.io.*;
 import java.util.*;
 
 public class EINLESEN
 { 
    private double punkte3;
    ObjectInputStream os;
     public EINLESEN() throws Exception
   { 
     try {
       FileInputStream fs = new FileInputStream("test.ser");
       os = new ObjectInputStream(fs);
     
    punkte3 = os.readDouble();
	String name = (String) os.readObject();
	
	

	//os.close();
     } catch (ClassNotFoundException e) {
       System.err.println(e.toString());
     } catch (IOException e) {
       System.err.println(e.toString());
     }
     finally
     { os.close(); }
     
     
   }
   
   public double getPunkte3()
{
    return(punkte3);
}
   
   
   
 }

achso ist das mit dem finally jetzt richtig? :)
 

feiste

Bekanntes Mitglied
aber jetzt passts oder? :)

Java:
 import java.io.*;
 import java.util.*;
 
 public class EINLESEN
 { 
    private double punkte3;
    ObjectInputStream os;
     public EINLESEN() throws Exception
   { 
     try {
       FileInputStream fs = new FileInputStream("test.ser");
       os = new ObjectInputStream(fs);
     
    punkte3 = os.readDouble();
	String name = (String) os.readObject();
	
	

	//os.close();
     } catch (ClassNotFoundException e) {
       System.err.println(e.toString());
     } catch (IOException e) {
       System.err.println(e.toString());
     }
     finally
     { os.close(); }
     
     
   }
   
    public static void main(String[] args) throws Exception
    { new EINLESEN(); }
   
   public double getPunkte3()
{
    return(punkte3);
}
   
   
   
 }
 

feiste

Bekanntes Mitglied
durch das

Java:
GameWindow gw = new GameWindow();

dann ladet der doch die komplette Klasse GameWindow
oder nicht?
 
G

Gelöschtes Mitglied 5909

Gast
So ein blödsinn was ihr da schreibt. Natürlich kann man statische Variablen Serialisieren, denn auch die sind Objekte.
Auch primitive Datentypen haben ihr Wrapper Objekte.

Ob es sinn macht und das ist was der TO will ist was anderes.

Und oben Serialisiert auch nur die Variable und nicht die Klasse die die statische Variable enthält, was ggf. sogar sinn machen kann.

Was absolut keinen sinn macht ist eine klasse die nur aus statischen Variablen besteht zu serialisieren.

Da er aber oben keinen typ für punkt2 stehn hat ist das schwierig herauszufinden.
 
Zuletzt bearbeitet von einem Moderator:

feiste

Bekanntes Mitglied
@ raiL

sorry habe " double " vergessen!

Java:
import java.io.Serializable;
 
public class SPIEL implements Serializable
{
public static double punkte2;
 
public SPIEL()
{ ...... }
}

Ob es sinn macht und das ist was der TO will ist was anderes.

Wann macht es denn Sinn statische Variablen zu serialisieren?

Und oben Serialisiert auch nur die Variable und nicht die Klasse die die statische Variable enthält, was ggf. sogar sinn machen kann.

Ich möchte nicht die komplette Klasse serialisieren sondern nur die variable !


Frage:
durch das



GameWindow gw = new GameWindow();


dann ladet der doch die komplette Klasse GameWindow
oder nicht?
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 5909

Gast
Ein kleines Beispiel:


Java:
package de.test;

import static org.junit.Assert.assertEquals;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import org.apache.commons.io.IOUtils;
import org.junit.Test;

public class SterialisationTestCase {

	public static class Holder implements Serializable {
		private static final long serialVersionUID = 1L;
		public static String foo = "foo";
	}

	@Test
	public void test1() throws Exception, IOException {

		File file = File.createTempFile("test", ".ser");
		ObjectOutputStream out = null;
		try {
			out = new ObjectOutputStream(new FileOutputStream(file));
			out.writeObject(Holder.foo);
		} finally {
			IOUtils.closeQuietly(out);
		}

		String actual;
		ObjectInputStream in = null;
		try {
			in = new ObjectInputStream(new FileInputStream(file));
			actual = (String) in.readObject();
		} finally {
			IOUtils.closeQuietly(in);
		}
		assertEquals(Holder.foo, actual);
		
		file.delete();
	}
	
}
 

feiste

Bekanntes Mitglied
danke !! =)
habe dazu aber noch ein paar Fragen:

1. seh ich das richtig
du schreibst alles in eine Methode ?
wie soll man denn dann dem Programm sagen,
wann es die Variable abspeichern soll
und wann es die Variable wieder deserialisieren soll?

2. für was steht den das "Holder" ?


3. Steht der befehl "file.delete();" dafür die gespeicherte Datei wieder zu löschen?
Wenn ja, wieso machst du das??
 
G

Gelöschtes Mitglied 5909

Gast
Das ist ein TestCase um dir zu zeigen dass das funktioniert :)

Es ist keinesfals gedacht, dass das später in einem "Programm" auftaucht.

Holder ist eine Klasse mit einer statischen Variablen. Siehe Zeile 18 bis 21
 

feiste

Bekanntes Mitglied
komme mit dem Beispiel leider nicht klar :/

wäre es möglich dass du mir so ein Beispiel machst?

man hat z.B eine statische Variable double x aus der Klasse A
=> A.x

diese will ich jetzt in der Klasse " EINLESEN " serialisieren
und dannach wieder in der Klasse " AUSLESEN " deserialisieren.

wäre das zuviel verlangt von dir?

______________________________

Angenommen ich will die Variable serialisieren, wenn gameover == true
würde das so doch so aussehen:

Java:
if(gameover == true)
{ new EINLESEN(); }
oder?
 
G

Gelöschtes Mitglied 5909

Gast
"Richtig" und gut sieht anders aus, aber es ist das was du anscheinend willst

Java:
package de.test;

public class A {

	public static double x = 1.0d;
	
}


package de.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Einlesen {

	public static void speichern(File file, Object object) throws IOException {
		ObjectOutputStream out = null;
		try {
			out = new ObjectOutputStream(new FileOutputStream(file));
			out.writeObject(object);
		} finally {
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
					// ignore
				}
			}
		}
	}
	
}

package de.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Auslesen {

	public static Object laden(File file) throws IOException {
		ObjectInputStream in = null;
		try {
			in = new ObjectInputStream(new FileInputStream(file));
			return in.readObject();
		} catch (Exception e) {
			throw new IOException(e);
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					// ignore
				}
			}
		}
	}
	
}

package de.test;

import java.io.File;
import java.io.IOException;

public class Main {

	public static void main(String[] args) throws IOException {
		File file = File.createTempFile("foo", ".ser");
		Einlesen.speichern(file, A.x);
		
		A.x = (Double) Auslesen.laden(file);
	}
	
}
 

feiste

Bekanntes Mitglied
vielen Dank !! =)
werds gleich ausprobieren :)


für was ist denn das:
Java:
package de.test;
?

ich denk mal das ist für mich nicht relevant,
da ich bluej verwende?
 
G

Gelöschtes Mitglied 5909

Gast
Das nennt sich package (wie da schon steht) und dient der "Gruppiernung" von Klassen.

Man stelle sich vor es existieren zwei Klassen "Einlesen" - was nu?

Für dich wird es nicht relevant sein
 

feiste

Bekanntes Mitglied
habe deine beiden klassen verwendet
und diese beiden:

Java:
import java.io.File;
import java.io.IOException;
public class deser
{ public static double highscore;
    public static void main(String[] args) throws IOException {
        File file = File.createTempFile("foo", ".ser");
        /
        
        highscore = (Double) Auslesen.laden(file);
        
    }
}

Java:
import java.io.File;
import java.io.IOException;

public class ser
{
    
    public static void main(String[] args) throws IOException {
        File file = File.createTempFile("foo", ".ser");
        Einlesen.speichern(file, SPIEL.punkte2);
        
      
    }
   

    
}

aber ich bekomm immer diese meldung:

java.io.IOException:
java.io.EOFException
 

feiste

Bekanntes Mitglied
des kann doch ned so schwer sein,
dass ich es schaff eine statische double variable
abzuspeichern damit ich seh beim start
wieder als Highscore anzeigen lassn kann^^
ich schaffs einfach nicht :/
 
G

Gelöschtes Mitglied 5909

Gast
Du musst halt erst mal was speichern damit du es wieder laden kannst
 
G

Gelöschtes Mitglied 5909

Gast
Du weißt aber dass createTempFile eine temporäre datei erzeugt, die jedesmal eine andere ist?

mach mal File file = new File("C:/foo.ser"); bei beiden
 

feiste

Bekanntes Mitglied
danke das geht jetzt :)

aber kanns sein, dass der Befehl

new ser();
bzw
new deser();

zum serialisieren/deserialisieren falsch ist ?
wegn der main methode..
 
G

Gelöschtes Mitglied 5909

Gast
ja, mit new erzeugst du ein neues objekt. Und da du außer der statischen main methode nix drinnen hast passiert auch nix.

Die Main methode ist im übrigen der EInstiegspunkt eines Programmes. Dir scheint es echt an Grundlegendem zu fehlen.

Ich empfehle dir dringend ein Buch zu lesen, ansonsten wird das nix.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Methoden Serialisieren Java Basics - Anfänger-Themen 17
H Interface Objekte speichern und laden (serialisieren/deserialisieren) Java Basics - Anfänger-Themen 1
J Serialisieren, aber wie? Java Basics - Anfänger-Themen 3
M Datum serialisieren Java Basics - Anfänger-Themen 1
M Serialisieren Java Basics - Anfänger-Themen 7
T Array serialisieren Java Basics - Anfänger-Themen 8
H Serialisieren Java Basics - Anfänger-Themen 9
E Serialisieren Java Basics - Anfänger-Themen 2
F Input/Output Serialisieren/Deserialisieren Java Basics - Anfänger-Themen 18
D Serialisieren, was bringt das? Java Basics - Anfänger-Themen 8
P Serialisieren-deserialisieren Java Basics - Anfänger-Themen 18
K Serialisieren mit Progress Java Basics - Anfänger-Themen 2
D Serialisieren/deserialisieren Java Basics - Anfänger-Themen 37
S JFrame mit JTextPane serialisieren Java Basics - Anfänger-Themen 5
W Objekt (de-)serialisieren Java Basics - Anfänger-Themen 5
G Serialisieren mehrerer Objekte in EINE (XML)-Datei Java Basics - Anfänger-Themen 12
E ArrayList mit eigenen typ serialisieren? Java Basics - Anfänger-Themen 1
R Objecte Serialisieren / Deserialisieren Java Basics - Anfänger-Themen 2
S Klassen Serialisieren Java Basics - Anfänger-Themen 5
V Objekt serialisieren/Deserialisieren und per get verschicken Java Basics - Anfänger-Themen 5
J Serialisierung - Array-Objekt serialisieren/deserialisieren Java Basics - Anfänger-Themen 6
V Serialisieren einer ShortMessage (javax.sound.midi) Java Basics - Anfänger-Themen 5
M Serialisieren beim Schließen des Progs sicher beenden Java Basics - Anfänger-Themen 4
H Datei nach serialisieren leer ? Java Basics - Anfänger-Themen 10
G static var serialisieren möglich? Java Basics - Anfänger-Themen 4
Lulumann6 Serialisieren? Java Basics - Anfänger-Themen 9
artur.cichosz Objekt als String serialisieren Java Basics - Anfänger-Themen 7
M Problem beim Serialisieren Java Basics - Anfänger-Themen 7
S Generics serialisieren? Java Basics - Anfänger-Themen 2
C LinkedList serialisieren? Java Basics - Anfänger-Themen 22
G Color und String serialisieren Java Basics - Anfänger-Themen 2
G alle Instanzen einer Klasse serialisieren Java Basics - Anfänger-Themen 4
C Mehrere Objekte in einer Liste einfügen und serialisieren Java Basics - Anfänger-Themen 1
S Vector serialisieren Java Basics - Anfänger-Themen 4
C Objekt serialisieren Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben