Serialisierung - Standardwert für nachträglich hinzugefügtes Feld

Cola_Colin

Top Contributor
Hallo,

ich habe habe gerade zu einer Klasse, von der ich bereits ein paar dutzend Serialisierungen habe, ein Feld hinzufügen müssen(wollen). Sein Standardwert soll 1 sein, blöderweise wird es mit 0 geladenen, wen ich eine der alten Dateien öffne. Da 0 im Bereich des Möglichen für den Wert liegt, kann ich nicht einfach sagen "0 ist falsch, 1 rein".

Das einzige, was mir einfällt ist das:
Java:
    private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
        s.defaultReadObject();
        if (dummy == null) { // Ist das Dummyfeld null, so wird das eigentliche Feld 1 sein müssen.
            gravityFactor = 1;
        }
    }

    // Das eigentliche neue Feld
    private float gravityFactor = 1;
    // Dummyfeld, gab es in der alten Version auch nicht
    private Object dummy = new Object();

Gibt es eine Möglichkeit diesen Standardwert elegant auf 1 zu setzen ? Meine Lösung wirkt doch... wie ein sehr umständlicher Workaround.

EDIT: Und es funktioniert nichtmal, der Wert 1 wird nun scheinbar immer eingelesen.
 
Zuletzt bearbeitet:

FArt

Top Contributor
Du könntest für den Faktor die Float-Klasse nehmen. Da gibt es dann den Untesrchied zwischen null und 0 und du sparst dir den Dummy.

Ich kenne ja jetzt nicht die ganze Klasse, aber evtl. könnte es sinnvoll sein das decorator pattern anzuwenden um die Daten/Zustande daran zu halten. Objekte dieser Art könenn auch leichter erweitert bzw. angepasst werden.
 

Cola_Colin

Top Contributor
Die Klasse speichert ausschließlich Daten um sie zu serialisieren, sie besitzt keine Funktionslogik.

Java:
// javaDoc 29.August
package gameDefinitions;

import java.awt.geom.Point2D;
import java.awt.geom.Point2D.Float;
import java.io.Serializable;
import java.lang.reflect.Field;

/**
 * Klasse bietet alle Infos, die für das erstellen eines {@link sprite.Sprite} nötig sind.<p>
 * Wird verwendet um per deserialisierung speicher und ladbare Levels zu erhalten.<p>
 * @author Colin Clausen
 */
public class SpriteDef implements Serializable, Cloneable {

    private static final long serialVersionUID = 5131138227391889114L;

    /**
     * Erstellt einen clone, der alle Felder, die nicht primitiv sind und Cloneable implementieren,
     * ebenfalls mit deren clone() cloned. <p>
     * Bei zirkulären Referenzen solcher Felder endet das vermutlich in einer Endlosschleife ?!
     * <p> Solche Referenzen dürfen nicht vorkommen.
     */
    @Override // Im Endeffekt ist das sicherlich inzwischen auch einfacher zu lösen. War mal so nötig. Da es so jedoch einfacher zu erweitern ist, lasse ich es so.
    public SpriteDef clone() {
        try {
            SpriteDef tmp = (SpriteDef) super.clone(); // Zuerst das Object normal clonen
            for (Class<?> c = tmp.getClass(); c != null; c = c.getSuperclass()) { // jetzt alle Felder durchlaufen
                Field[] declaredFields = c.getDeclaredFields();
                Field.setAccessible(declaredFields, true); // auf alle Felder zugreifen
                for (Field f : declaredFields) {
                    interfacesearch: // suche nach dem Interface Cloneable bei alle Feldern,
                    if (!f.getType().isPrimitive()) { // die nicht primitiv sind
                        for (Class<?> tClass = f.getType(); tClass != null; tClass = tClass.getSuperclass()) {
                            Class<?>[] interfaces = tClass.getInterfaces();
                            for (Class<?> aC : interfaces) {
                                if (aC.equals(Cloneable.class)) {
                                    try { // wenn Interface gefunden, also das Feld cloneable ist, dann clone es.
                                        f.set(tmp, tClass.getMethod("clone", (Class<?>[]) null).invoke(f.get(tmp), (Object[]) null));
                                        break interfacesearch;
                                    } catch (Exception ex) {
                                        ex.printStackTrace();
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return tmp;
        } catch (CloneNotSupportedException e) {
            throw new Error(e); // Wenn das passiert ist irgendwas ganz ganz schief gewickelt.
        }
    }

    /** Name */
    String name = "Sample";
    /** Position */
    Point2D.Float position = new Point2D.Float(0, 0);
    /** Rotationsausrichtung im Bogenmaß*/
    float angle = 0;
    /** Z Koordinate des Körpers (layer) */
    int z = 0;
    /** Soll die Rotation des Körpers gefixed werden ?*/
    boolean fixAngle = false;
    /** Größe */
    Point2D.Float size = new Point2D.Float(10, 10);
    /** Texturename */
    String textureName = "";
    /** Animationsstart */
    int animStart = 1;
    /** AnimationsEnde */
    int animEnd = 1;
    /** Animationszustand, ist animEnabled == false oder animStart == animEnd, so bleibt es auch bei diesem */
    int animState = 1;
    /** Geschwindigkeit der Animation in Bildern pro Sekunde */
    float animSpeed = 1;
    /** Name Shape */
    String shapeName = null;
    /** Restitution des Shapes */
    float restituion = 0;
    /** Friction des Shapes */
    float friction = 1;
    /** Dichte des Shapes */
    float density = 1;
    /** Angabe, ob das Shape ein Sensor ist. Ein Sensor erzeugt keine Kollisionsantworten, führt jedoch zu Collisionevents */
    boolean isSensor = false;
    /** Dämpfung, die auf Bewegungen des Sprites wirkt */
    float damping = 0;

    /** Script File für dieses Shape */
    String script = "static";
    /** Settingsfile für dieses Shape */
    String scriptSettings = "none";

    public boolean isSensor() {
        return isSensor;
    }

    public String getScript() {
        return script;
    }

    public String getScriptSettings() {
        return scriptSettings;
    }

    public String getName() {
        return name;
    }

    public float getDamping() {
        return damping;
    }

    public float getDensity() {
        return density;
    }

    public float getFriction() {
        return friction;
    }

    public float getRestituion() {
        return restituion;
    }

    public String getShapeName() {
        return shapeName;
    }

    public float getAnimSpeed() {
        return animSpeed;
    }

    public int getAnimState() {
        return animState;
    }

    public int getAnimEnd() {
        return animEnd;
    }

    public int getAnimStart() {
        return animStart;
    }

    public String getTextureName() {
        return textureName;
    }

    public Point2D.Float getSize() {
        return (Float) size.clone();
    }

    public boolean isFixedAngle() {
        return fixAngle;
    }

    public int getZ() {
        return z;
    }

    public float getAngle() {
        return angle;
    }

    public Point2D.Float getPosition() {
        return (Float) position.clone();
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPosition(Point2D.Float position) {
        this.position = position;
    }

    public void setPosition(float x, float y) {
        this.position = new Point2D.Float(x, y);
    }

    public void setAngle(float angle) {
        this.angle = angle;
    }

    public void setZ(int z) {
        this.z = z;
    }

    public void setFixAngle(boolean fixAngle) {
        this.fixAngle = fixAngle;
    }

    public void setSize(Point2D.Float size) {
        this.size = size;
    }

    public void setTextureName(String textureName) {
        this.textureName = textureName;
    }

    public void setAnimStart(int animStart) {
        this.animStart = animStart;
    }

    public void setAnimEnd(int animEnd) {
        this.animEnd = animEnd;
    }

    public void setAnimState(int animState) {
        this.animState = animState;
    }

    public void setAnimSpeed(float animSpeed) {
        this.animSpeed = animSpeed;
    }

    public void setShapeName(String shapeName) {
        this.shapeName = shapeName;
    }

    public void setRestituion(float restituion) {
        this.restituion = restituion;
    }

    public void setFriction(float friction) {
        this.friction = friction;
    }

    public void setDensity(float density) {
        this.density = density;
    }

    public void setIsSensor(boolean isSensor) {
        this.isSensor = isSensor;
    }

    public void setDamping(float damping) {
        this.damping = damping;
    }

    public void setScript(String script) {
        this.script = script;
    }

    public void setScriptSettings(String scriptSettings) {
        this.scriptSettings = scriptSettings;
    }
}

Decorator bringen da wenig, oder ? Von der Beschreibung auf wiki her, sind ja z.B. die ganzen Streams nach dem Konzept geschrieben ? Pattern kenne ich nicht soviele :oops:

Ich probiere mal ein Float Objekt.

Danke für die Tipps.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
antonia09 Einkaufszettel Persistenz und Serialisierung Allgemeine Java-Themen 6
D Serialisierung und Deserialisierung von Objekten - Frageprogramm Allgemeine Java-Themen 4
R Datentypen Korrekte integer in Hex ASCII Konvertierung und serialisierung Allgemeine Java-Themen 1
M Serialisierung funktioniert nicht Allgemeine Java-Themen 9
Z Best Practice Serialisierung Allgemeine Java-Themen 2
Arif Input/Output Serialisierung - Datei wird nicht erzeugt Allgemeine Java-Themen 3
M Alternative zur Serialisierung.. Protobuf? Allgemeine Java-Themen 9
E Serialisierung - Deserialisierung Allgemeine Java-Themen 4
Thallius Serialisierung schlägt fehl. Allgemeine Java-Themen 3
M Serialisierung & Verschlüsselung Allgemeine Java-Themen 2
E Serialisierung - Sinn einer generierten serialVersionUID? Allgemeine Java-Themen 4
V Serialisierung von Instanz eigener Klasse Allgemeine Java-Themen 5
A Input/Output Serialisierung und Object.hashCode() Allgemeine Java-Themen 3
K Serialisierung einer verschachtelten Datenstuktur Allgemeine Java-Themen 9
Tobse Input/Output Dateiformat: Serialisierung VS Custom format Allgemeine Java-Themen 6
A Problem bei Serialisierung von Bibliotheks-Klassen Allgemeine Java-Themen 6
A Input/Output Serialisierung Sonderzeichen Allgemeine Java-Themen 3
P Serialisierung der Oberklasse Allgemeine Java-Themen 2
Kr0e Circular reference - Serialisierung Allgemeine Java-Themen 6
K Serialisierung in Properties-Datei möglich? Allgemeine Java-Themen 3
B Serialisierung mit Unterobjekten über Netzwerk Allgemeine Java-Themen 3
S Serialisierung der Kindklasse Allgemeine Java-Themen 5
K Serialisierung komplett selbst machen Allgemeine Java-Themen 13
C Serialisierung ohne Serializable Allgemeine Java-Themen 4
S Serialisierung und Referenzen Allgemeine Java-Themen 6
S Viele Bilder -> Speicher ausgelastet? / (De-)serialisierung geht nicht mehr richtig Allgemeine Java-Themen 8
E Objekt bei Serialisierung ändern Allgemeine Java-Themen 2
Q Serialisierung / Speicherung Geschwindingkeit & Aktuelle Position Allgemeine Java-Themen 7
Z Serialisierung und Deserialisierung einer HashMap Allgemeine Java-Themen 17
W Serialisierung Allgemeine Java-Themen 6
K Serialisierung von Hashmap in Vector Allgemeine Java-Themen 3
F Serialisierung und Obfuscation? Allgemeine Java-Themen 7
G (De)serialisierung und Referenzen Allgemeine Java-Themen 5
T Serialisierung: Wie macht RMI das so schnell? Allgemeine Java-Themen 14
J Serialisierung: readInt + writeInt Allgemeine Java-Themen 4
X Einige Fragen zu Serialisierung Allgemeine Java-Themen 2
J bean + serialisierung + serialVersionUID Allgemeine Java-Themen 3
K Serialisierung Allgemeine Java-Themen 6
thE_29 Wie funktioniert Serialisierung? Allgemeine Java-Themen 10
S Problem mit Serialisierung Allgemeine Java-Themen 2
C Serialisierung von JComboBox Allgemeine Java-Themen 4
W Vergleichstool für xml-Dateien Tortoise-svn Verknüpfung Allgemeine Java-Themen 2
Zrebna Tipps für Organisation von Code-Reviews nach einem Pull Request. Allgemeine Java-Themen 5
Zrebna Bitte um Empfehlungen für "zeitlose" Bücher bzgl. Backend mit Spring und Beans Allgemeine Java-Themen 25
D Lesbare args für die main-Methode Allgemeine Java-Themen 6
B Algorithmus für Arbeit mit fehlenden Listenelementen? Allgemeine Java-Themen 1
kodela Eingabe für TextArray bedingt sperren Allgemeine Java-Themen 3
Karl_Der_Nette_Anfänger Hat wer ne Lösung für verknüpfte Postleitzahlen? (Baum/Wurzel Struktur) Allgemeine Java-Themen 11
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
G KeyListener für JTextField Allgemeine Java-Themen 5
webracer999 Library für Textsuche (z. B. include/exclude, and/or)? Allgemeine Java-Themen 5
I Module-Info für Jar erzeugen Allgemeine Java-Themen 7
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
B Simpler Eventlistener für Tastaturtaste bauen? Allgemeine Java-Themen 13
_user_q Eingegebenen Text Zeile für Zeile ausgeben lassen Allgemeine Java-Themen 11
E Key für TOTP Algorythmus(Google Authentificator) Allgemeine Java-Themen 0
S Formel für Sonnenwinkel in ein Programm überführen Allgemeine Java-Themen 11
M pfx-Zertifikat in Tomcat für SSL-Verschlüsselung nutzen Allgemeine Java-Themen 14
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
jhCDtGVjcZGcfzug Klassen Was genau passiert hier? Kann mir das jemand bitte Zeile für Zeile erklären? Allgemeine Java-Themen 1
rosima26 Bester Sortieralgorithmus für kurze Arrays Allgemeine Java-Themen 40
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
MangoTango Operatoren while-Schleife für Potenz Allgemeine Java-Themen 3
B Lottospiel, genug Reihen tippen für 3 Richtige (Spaß mit Arrays)? Allgemeine Java-Themen 46
B Mit welchen Datentypen und Strukturierung am Besten dutzende Baccaratspiele Shcritt für Schritt durchsimulieren? Allgemeine Java-Themen 26
D Klassendesign für einen Pascal Interpreter Allgemeine Java-Themen 6
I OCR Library für Belegerkennung Allgemeine Java-Themen 7
farah GetterMathod für Farbkanäle Allgemeine Java-Themen 6
B Welcher Datentyp für sehr große Zahlenbereiche? Allgemeine Java-Themen 1
S Webservices für binäre Daten? Allgemeine Java-Themen 5
G Licence-Header für InHouse entwickelten Source Allgemeine Java-Themen 8
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
O git ignore für Intellji braucht es die .idea Dateien? Allgemeine Java-Themen 8
F Java Script für das Vorhaben das richtige? Allgemeine Java-Themen 9
M wiviel Java muss ich für die Berufswelt können ? Allgemeine Java-Themen 5
Robertop Datumsformat für GB ab Java 16 Allgemeine Java-Themen 1
Thallius Verschiedene entities für gleichen Code…. Allgemeine Java-Themen 8
OnDemand Zentrale "Drehscheibe" für verschiedene APIs Allgemeine Java-Themen 14
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
D SHA-3 für Java-version 1.8 Allgemeine Java-Themen 1
N Validator für einen SQL-Befehl Allgemeine Java-Themen 22
Muatasem Hammud Erstellung von Testdaten für Arrays Allgemeine Java-Themen 6
B Logikfehlersuche, das perfekte Lottosystem für 3 Richtige mit Arraylists? Allgemeine Java-Themen 61
G Methoden für die Zukunft sinnvoll? Allgemeine Java-Themen 4
M API für PLZ Umkreissuche Allgemeine Java-Themen 3
1Spinne JDK 8 für Eclipse installieren Allgemeine Java-Themen 5
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
L Methoden Parser für gängige Datumsformate? Allgemeine Java-Themen 1
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
N relativier Pfad für sqlite-Datenbank in Gradle/IntelliJ Allgemeine Java-Themen 2
buchfrau Anagram für beliebiges Wort Allgemeine Java-Themen 2
TonioTec Api für Datenaustausch zwischen Client und Server Allgemeine Java-Themen 0
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
Kirby.exe Distanz Map für die Distanztransformation erstellen Allgemeine Java-Themen 1
F PI Regler für Heizung Allgemeine Java-Themen 7
8u3631984 Generelle Log4j.xml für alle Module Allgemeine Java-Themen 5
M Wie übergebe ich den Zähler für die Anzahl Rekursionsschritte korrekt? Allgemeine Java-Themen 2
B Login für User, der im Hintergrund Schedules ausführt Allgemeine Java-Themen 16

Ähnliche Java Themen


Oben