Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:



readResolve() vrací singleton instanci defaultních hodnot

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

readResolve() vrací singleton instanci defaultních hodnot

Autor: Erron Black ♂

21:00:43 23.04.2015

Zdravím,
mám problém se serializací singleton třídy. Dokud nepoužiju readResolve(který je pro zachování singleton funkčnosti nezbytný) vše funguje jak má, ale když je readResolve() součástí kódu, vrací serializace instanci s defaultními hodnotami ne těmi, které byly deserializovány. Zde je kód a předem děkuji za každou radu.

public class SnakeGameSettings implements Serializable {
// trida vyuziva konceptu staticke singleton instance
public enum Speed{ SLOW(1), NORMAL(3), FAST(5), INSANE(7); // enum trida pro rychlosti
public int movementSpeed;

private Speed(int speed){ // privatni konstruktor
this.movementSpeed = speed;
}
}

// singleton instance této třídy
private static SnakeGameSettings GAME_SETTINGS;

// atributy
transient private Color headColor;
transient private Color bodyColor;
transient private Color gameBoardColor;
transient private Color statsBoxColor;
private int xBorders;
private int yBorders;
transient private Speed speed;

private static final long serialVersionUID = 6661666166616661L; // serializační ID

// privátní kontruktor (nevolatelný zvenčí)
private SnakeGameSettings(){

this.headColor = Color.BLACK;
this.bodyColor = Color.RED;
this.gameBoardColor = Color.WHITE;
this.statsBoxColor = Color.web("#f7ab74");
this.xBorders = 600;
this.yBorders = 600;
this.speed = Speed.NORMAL;

}

// metoda pro vrácení/vytvoření jedinné singleton instance
public static SnakeGameSettings getInstance(){
if (GAME_SETTINGS == null){
GAME_SETTINGS = new SnakeGameSettings();
}

return GAME_SETTINGS;
}


// metoda pro vytvoření a vrácení scény
public Scene getScene(){
//layouty
GridPane grid = new GridPane();
grid.setAlignment(Pos.TOP_CENTER);
grid.setPadding(new Insets(10,10,10,10));
grid.setHgap(250);
grid.setVgap(5);

HBox buttonBox = new HBox();
buttonBox.setAlignment(Pos.CENTER);
buttonBox.setSpacing(10);

// komponenty → labely
Label lb1 = new Label("Head color");
lb1.getStyleClass().add("labelStyle");

Label lb2 = new Label("Body color");
lb2.getStyleClass().add("labelStyle");

Label lb3 = new Label("Playground color");
lb3.getStyleClass().add("labelStyle");

Label lb4 = new Label("Statsboard color");
lb4.getStyleClass().add("labelStyle");

Label lb5 = new Label("Eating sound");
lb5.getStyleClass().add("labelStyle");

Label lb6 = new Label("Speed");
lb6.getStyleClass().add("labelStyle");

Label lb7 = new Label("Window width");
lb7.getStyleClass().add("labelStyle");

Label lb8 = new Label("Window height");
lb8.getStyleClass().add("labelStyle");

// komponenty → ColorPickery
ColorPicker headColorPicker = new ColorPicker();
headColorPicker.setValue(GAME_SETTINGS.headColor);

ColorPicker bodyColorPicker = new ColorPicker();
bodyColorPicker.setValue(GAME_SETTINGS.bodyColor);

ColorPicker boardColorPicker = new ColorPicker();
boardColorPicker.setValue(GAME_SETTINGS.gameBoardColor);

ColorPicker statsColorPicker = new ColorPicker();
statsColorPicker.setValue(GAME_SETTINGS.statsBoxColor);

//Komponenty → comboBoxy
ComboBox soundBox = new ComboBox();

ComboBox speedBox = new ComboBox();
speedBox.getItems().addAll(Speed.SLOW,Speed.NORMAL, Speed.FAST, Speed.INSANE); //přidání hodnot(int) rychlosti
speedBox.getSelectionModel().select(GAME_SETTINGS.speed);

// Komponenty → textFieldy
TextField windowWidhtTxtF = new TextField();
windowWidhtTxtF.setText(Integer.toString(GAME_SETTINGS.getxBorders()));

TextField windowHeightTxtF = new TextField();
windowHeightTxtF.setText(Integer.toString(GAME_SETTINGS.getyBorders()));

// komponenty → buttony
Button applyButton = new Button("Apply");
applyButton.setMinSize(150,25);
applyButton.setMaxSize(150,25);

Button stornoButton = new Button("Storno");
stornoButton.setMinSize(150, 25);
stornoButton.setMaxSize(150, 25);

Button defaultSetButton = new Button("Default settings");
defaultSetButton.setMinSize(150, 25);
defaultSetButton.setMaxSize(150, 25);

// event buttonu apply + implmentace
EventHandler applyEventHandler = new EventHandler<ActionEvent>(){
@Override public void handle(ActionEvent event){

try{
GAME_SETTINGS.xBorders = Integer.parseInt(windowWidhtTxtF.getText());
GAME_SETTINGS.yBorders = Integer.parseInt(windowHeightTxtF.getText());
}catch (NumberFormatException pasrseExcp){
windowWidhtTxtF.setText("Must be a number");
windowWidhtTxtF.setStyle("-fx-text-fill: RED;");

windowHeightTxtF.setText("Must be a number");
windowHeightTxtF.setStyle("-fx-text-fill: RED;");
return;
}

GAME_SETTINGS.headColor = headColorPicker.getValue();
GAME_SETTINGS.bodyColor = bodyColorPicker.getValue();
GAME_SETTINGS.gameBoardColor = boardColorPicker.getValue();
GAME_SETTINGS.statsBoxColor = statsColorPicker.getValue();
GAME_SETTINGS.speed = (Speed)speedBox.getValue();

SnakeMainMenu.getMainStage().setScene(SnakeMainMenu.getMainScene());
}
};

applyButton.setOnAction(applyEventHandler);


// event buttonu storno + implementace
EventHandler stornoEventHandler = new EventHandler<ActionEvent>(){
@Override public void handle(ActionEvent event){
SnakeMainMenu.getMainStage().setScene(SnakeMainMenu.getMainScene());
}
};

stornoButton.setOnAction(stornoEventHandler);

// Event buttonu pro požití defaultního nastavení
EventHandler defaultSetButtonHandler = new EventHandler<ActionEvent>(){
@Override public void handle(ActionEvent event){

GAME_SETTINGS.headColor = Color.BLACK;
GAME_SETTINGS.bodyColor = Color.RED;
GAME_SETTINGS.gameBoardColor = Color.WHITE;
GAME_SETTINGS.statsBoxColor = Color.web("#f7ab74");
GAME_SETTINGS.xBorders = 600;
GAME_SETTINGS.yBorders = 600;
GAME_SETTINGS.speed = Speed.NORMAL;

SnakeMainMenu.getMainStage().setScene(SnakeMainMenu.getMainScene());
}
};

defaultSetButton.setOnAction(defaultSetButtonHandler);


//sestaveni sceny
grid.add(lb1, 0, 0);
grid.add(lb2, 0, 1);
grid.add(lb3, 0, 2);
grid.add(lb4, 0, 3);
// grid.add(lb5, 0, 4);
grid.add(lb6, 0, 5);
grid.add(lb7, 0, 6);
grid.add(lb8, 0, 7);

grid.add(headColorPicker, 1, 0);
grid.add(bodyColorPicker, 1, 1);
grid.add(boardColorPicker, 1, 2);
grid.add(statsColorPicker, 1, 3);

// grid.add(soundBox, 1, 4);
grid.add(speedBox, 1, 5);

grid.add(windowWidhtTxtF, 1, 6);
grid.add(windowHeightTxtF, 1, 7);
grid.add(defaultSetButton, 1, 8);

buttonBox.getChildren().addAll(applyButton, stornoButton);
grid.add(buttonBox, 0, 60, 2, 1);

Scene scene = new Scene(grid, 600, 600);
scene.getStylesheets().add("GameStylePackage/SettingsStyle.css");
return scene;
}

// přetížení readObject
private void readObject(ObjectInputStream oi) throws IOException, ClassNotFoundException{

oi.defaultReadObject(); // přečtení netransientnich (initializable) atributu

this.headColor = Color.web((String)oi.readUTF()); // inicializování (přečtení a parsnutí serializovatelných hodnot do neserializovatelných atributu) trans. atributu
this.bodyColor = Color.web((String)oi.readUTF());
this.gameBoardColor = Color.web((String)oi.readUTF());
this.statsBoxColor = Color.web((String)oi.readUTF());

switch ((String)oi.readUTF()){ // inicializace atributu typu Speed(enum)

case "SLOW" : this.speed = Speed.SLOW; break;

case "NORMAL": this.speed = Speed.NORMAL; break;

case "FAST" : this.speed = Speed.FAST; break;

case "INSANE": this.speed = Speed.INSANE; break;

default : this.speed = Speed.NORMAL;

}
}


// pretizeni writeObject
private void writeObject(ObjectOutputStream oo) throws IOException{
oo.defaultWriteObject(); // zapsání netransient atributu (Serializovatelné typy)

oo.writeUTF(this.headColor.toString()); // zapsání hodnot neserializovatelných (transientnich) atributu v serializovatelné podobě (typu)
oo.writeUTF(this.bodyColor.toString());
oo.writeUTF(this.gameBoardColor.toString());
oo.writeUTF(this.statsBoxColor.toString());
oo.writeUTF(this.speed.name());

}

/*

// přetížení metody readResolve pro účely zacování singleton funkce; je volána automaticky; stačí, aby byla implementována
private Object readResolve()throws ObjectStreamException{
return SnakeGameSettings.getInstance();
}

*/


// metoda pro načtení settingu
public void loadSettings(String storageAddress) throws IOException{
ObjectInputStream input = null;
File storageFile = new File(storageAddress);

try{
if (storageFile.createNewFile()){
System.out.println("DEBUG MESSAGE: uložiště settingClass aplikace bylo poprvé vytvořeno");

}else{
input = new ObjectInputStream(new BufferedInputStream(new FileInputStream(storageFile)));
GAME_SETTINGS = (SnakeGameSettings) input.readObject();
System.out.println("DEBUG MESSAGE: načten uložený setting objekt");
}

}catch (Exception loadSettExcp){ System.out.println(loadSettExcp.getMessage());
}finally{if (input != null){input.close();} }
}


// metoda pro uložení setting
public void storeSettings(String storageAddress) throws IOException{
ObjectOutputStream output = null;

try{
output = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(storageAddress)));
output.writeObject(GAME_SETTINGS);

}catch (IOException storeSettExcp){ System.out.println(storeSettExcp.getMessage());
}finally{if (output != null){output.close();}
}
}


//gettery
public Color getHeadColor() {
return headColor;
}

public Color getBodyColor() {
return bodyColor;
}

public Color getGameBoardColor() {
return gameBoardColor;
}

public Color getStatsBoxColor() {
return statsBoxColor;
}

public int getxBorders() {
return xBorders;
}

public int getyBorders() {
return yBorders;
}
public Speed getSpeed() {
return speed;
}

}

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: