Java сериализуется с наследованием? - PullRequest
0 голосов
/ 25 июня 2018

Вот Goals.java

public abstract class Goals {
private String score;

public Goals(String str) {
    this.score = str;
}

String getGoals() {
    return this.score;
}

   void doSomething(score) {
    }
    }

Вот Game.java

public class Game implements Serializable {
    public String name;
    public int game_num;
    public int opp;
    public int player;
    public Goals goal;

    public Game(int i, int i2, int i3) {
        this.player = i;
        this.game_num = i2;
        this.opp = i3;
    }

    public Game(String str, Goals goal) {
        this.name = str;
        this.goal = goal;
    }

}

Можем ли мы создать сериализованный объект таким образом, чтобы после его десериализации и приведения кGame, он установит score внутри Goals.java?Кроме того, можете ли вы манипулировать / перезаписывать метод doSomething, если сериализованные данные поступают из ненадежного источника?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Как уже упоминалось в комментариях, реализуйте цели и их реализацию с помощью Serializable, а также реализуйте конструктор по умолчанию в обоих классах.

Рабочая часть кода:

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

abstract class Goals implements Serializable{
private String score;


public Goals() {
    this(null);
}

public Goals(String str) {
    this.score = str;
}

String getGoals() {
    return this.score;
}

   void doSomething(int score) {
    }
    }

class Game implements Serializable {
    public String name;
    public int game_num;
    public int opp;
    public int player;
    public Goals goal;

    public Game(int i, int i2, int i3) {
        this.player = i;
        this.game_num = i2;
        this.opp = i3;
    }

    public Game(String str, Goals goal) {
        this.name = str;
        this.goal = goal;
    }

}

class GoalImpl extends Goals implements Serializable{
    public GoalImpl() {
        }
    public GoalImpl(String str) {
        super(str);
    }

}

public class Main{
    public static void main(String...s) {
        Goals goal = new GoalImpl("20");
        Game game = new Game("name",goal);

        try
        {   
            //Saving of object in a file
            FileOutputStream file = new FileOutputStream("gamefile.ser");
            ObjectOutputStream out = new ObjectOutputStream(file);


            // Method for serialization of object
            out.writeObject(game);

            out.close();
            file.close();

            System.out.println("Object has been serialized");

        }

        catch(IOException ex)
        {
            ex.printStackTrace();
            System.out.println("IOException is caught");
        }


        Game object1 = null;

        // Deserialization
        try
        {   
            // Reading the object from a file
            FileInputStream file = new FileInputStream("gamefile.ser");
            ObjectInputStream in = new ObjectInputStream(file);

            // Method for deserialization of object
            object1 = (Game)in.readObject();

            in.close();
            file.close();

            System.out.println("Object has been deserialized ");
            System.out.println("score = " + object1.goal.getGoals());
        }

        catch(IOException ex)
        {
            ex.printStackTrace();
            System.out.println("IOException is caught");
        }

        catch(ClassNotFoundException ex)
        {
            System.out.println("ClassNotFoundException is caught");
        }


    }
}

Выход:

Object has been serialized
Object has been deserialized 
score = 20

PS:

  1. Совет сделать счет целым числом, так как в противном случае вы не сможете выполнять основные операции, такие как увеличение или уменьшение счета, используя встроенные операторы (+, -)

  2. В этом случае всегда указывайте правильное имя метода получения, например, getScore () и setScore.

  3. Старайтесь синхронизировать конструкторов, например, в случае вызова конструктора игры с идентификатором игрока, номером игры и противодействием, имя игры и цели никогда не будут инициализированы, лучше инициализировать их значением по умолчанию или другим хороший вариант - сделать другой конструктор, принимающий все параметры, и затем из отдельных конструкторов вы можете вызвать главный конструктор и передать значения по умолчанию для тех, которые не переданы вызывающим методом.

0 голосов
/ 25 июня 2018

То, как вы пытаетесь манипулировать своими объектами, я думаю, вы можете сделать так, чтобы Цели реализовывали Serializable, а Игры реализовывали Цели:

public abstract class Goals implements Serializable{
private String score;

public Goals(String str) {
    this.score = str;
}

String getGoals() {
    return this.score;
}

   void doSomething(score) {
    }
    }

для Игры

public class Game extends Goals {
    public String name;
    public int game_num;
    public int opp;
    public int player;

    public Game(int i, int i2, int i3) {
        this.player = i;
        this.game_num = i2;
        this.opp = i3;
    }

    public Game(String str) {
        //create constructor also including the properties of Goals
        Super()...
    }

}
...