Проблемы с получением JavaBeans для записи в XML - PullRequest
0 голосов
/ 03 ноября 2019

Мой код записывает имя в XML-документ, но не записывает результаты тестов. Результаты тестов всегда выводят 0, даже когда я меняю имя. Я был бы очень признателен за любую помощь в выяснении, почему это так. Я связал класс с методом main, а класс с конструктором. Спасибо за помощь!

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class Studentp194Runner {

public static void main(String[] args)
{           
    Studentp194 s1 = new Studentp194();

    Scanner reader = new Scanner(System.in);
    System.out.print("Enter student name: ");
    s1.setName(reader.nextLine());
    System.out.print("Enter the student's first score: ");
    s1.setScore(1, reader.nextInt());
    System.out.print("Enter the student's second score: ");
    s1.setScore(2, reader.nextInt());
    System.out.print("Enter the student's third score: ");
    s1.setScore(3, reader.nextInt());

    try
    {
        FileOutputStream fos = new FileOutputStream(new File("./student.xml"));
        XMLEncoder encoder = new XMLEncoder(fos);
        encoder.writeObject(s1);
        encoder.close();
        fos.close();
    }
    catch(IOException ex)
    {
        ex.printStackTrace();
    }

    try
    {
        FileInputStream fis = new FileInputStream(new File("./student.xml"));
        XMLDecoder decoder = new XMLDecoder(fis);
        Studentp194 p2 = (Studentp194)decoder.readObject();
        decoder.close();
        fis.close();
        System.out.println("Student 1 name: " + p2.getName());
        System.out.println("Test 1: " + p2.getScore(1));
        System.out.println("Test 2: " + p2.getScore(2));
        System.out.println("Test 3: " + p2.getScore(3));

    }
    catch(IOException ex)
    {
        ex.printStackTrace();
    }   
}

}

public class Studentp194 {
//instance variable
private String name;
private int test1;
private int test2;
private int test3;

//constructor method

public Studentp194()
{

}

public Studentp194(String name, int test1, int test2, int test3)
{
    this.name = name;
    this.test1 = test1;
    this.test2 = test2;
    this.test3 = test3;
}

//Other Methods

public String getName() {
    return name;
}

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

public void setScore(int i, int score){
    if (i == 1)
        test1 = score;
    if(i == 2)
        test2 = score;
    else
        test3 = score;
}

public int getScore(int i)
{
    if (i == 1)
        return test1;
    if (i == 2)
        return test2;
    else
        return test3;
}

public int getAverage()
{
    int average = (int)Math.round((test1 + test2 + test3) / 3);
    return average;
}

public int getHighScore()
{
    int highScore = test1;
    if(test2 > highScore)
        highScore = test2;
    if(test3 > highScore)
        highScore = test3;
    return highScore;
}

public String toString()
{
    String str = "Name: " + name + "\n" + 
                 "Test 1: " + test1 + "\n" +
                 "Test 2: " + test2 + "\n" +
                 "Test 3: " + test3 + "\n" +
                 "Average: " + getAverage();
    return str;
}

}

1 Ответ

0 голосов
/ 03 ноября 2019

Кратчайший возможный ответ, который является технически правильным, но бесполезным для тех, кто не знаком с Java-бинами: Studentp194 не имеет свойства score. Поэтому несуществующее свойство score не кодируется в XML как XMLEncoder.

Чтобы действительно понять, что происходит, если вы хотите продолжать использовать XMLEncoder, который может быть, а может и не бытьлучшее решение для реальной проблемы, которую вы пытаетесь решить, вы должны прочитать о потрясающе древней, но (ИМХО) потрясающей спецификации Java Beans .

Для любого произвольного класса иметь JavaСвойство Beans с именем, скажем, foo, тип которого Foo, должно иметь метод public Foo getFoo() и метод public void setFoo(Foo foo). Как вы можете видеть, ваш класс Studentp194 не имеет метода public int getScore() и не имеет метода public void setScore(int score).

(Конечно, спецификация Java Beans фактически не требует, чтобы они былинеобходимые имена ваших методов. Вы можете настроить их несколькими способами, включая использование BeanInfo классов , но это выходит за рамки этого вопроса.)

Возвращаясь к вашему вопросу и к вашему коду, XMLEncoder не поможет вам с дизайном вашего класса как есть, так как ваш метод getScore принимает параметры, а ваш метод setScore принимает более одного параметра. Поэтому они не являются свойствами Java Beans;следовательно, XMLEncoder не собирается, ну, в общем, кодировать их.

Допустим, вы хотели по какой-либо причине продолжать использовать XMLEncoder. Тогда вам придется провести рефакторинг вашего класса, чтобы он соответствовал спецификации Java Beans. Я оставлю это как упражнение для читателя. :-)

Я предполагаю, что это какое-то задание, и использование XMLEncoder является требованием присвоения. Если я не прав, тогда посмотрите на другой формат файла для хранения вашей информации и ее извлечения.

Если я прав, то вы хотите взглянуть на тот факт, что ваш класс Studentp194 логически связан с набором или массивом баллов. Возможно, вы захотите взглянуть в направлении фактического создания класса, представляющего результаты теста, и сохранения коллекции таких результатов теста в вашем классе Studentp194. Еще лучше, возможно, ваш Studentp194 класс хочет быть связанным с другим классом, таким как Transcript или чем-то подобным, где эта информация может храниться должным образом. Для получения дополнительной информации об этом декомпозиционном подходе к решению проблем прочитайте «третью нормальную форму» и перейдите оттуда. Надеюсь, это поможет и добро пожаловать в StackOverflow.

...