Java 反序列化问题
Java Problems With Deserialization
我知道这个问题以前有人回答过,但是我怎么努力都找不到答案。
我正在尝试序列化和反序列化 Java 中的对象。我在反序列化中遇到问题。我没有得到输入的值,而是 prueba.Estudiantes@1bd7848 的内容。为什么我得到的是这个而不是输入的实际值?
这是我的代码
package prueba;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Prueba {
public static void main(String[] args) throws FileNotFoundException,IOException, ClassNotFoundException {
File file = new File("f.txt");
List <Estudiantes> lista = new ArrayList<>();
boolean continuar = true;
while (continuar == true){
Estudiantes es = new Estudiantes();
System.out.println("Ingrese nombre");
Scanner kb = new Scanner(System.in);
es.nombre = kb.nextLine();
System.out.println("Ingrese Apellido");
Scanner kb1 = new Scanner(System.in);
es.apellido = kb1.nextLine();
System.out.println("Ingrese Número");
Scanner kb2 = new Scanner(System.in);
es.numero = kb2.nextInt();
lista.add(es);
FileOutputStream fo = new FileOutputStream(file);
ObjectOutputStream output = new ObjectOutputStream(fo);
for (Estudiantes est: lista){
output.writeObject(est);
}
output.close();
fo.close();
FileInputStream fi = new FileInputStream(file);
ObjectInputStream input = new ObjectInputStream(fi);
ArrayList<Estudiantes> est2 = new ArrayList<Estudiantes>();
try {
while (true){
Estudiantes s = (Estudiantes)input.readObject();
est2.add(s);
}
}
catch (EOFException ex){}
for (Estudiantes s :est2){
System.out.println(s);
fi.close();
input.close();
}
System.out.println("0 para salir; 1 para continuar");
Scanner kb3 = new Scanner(System.in);
int rev = kb3.nextInt();
if (rev == 0){
continuar = false;
System.out.println("Hasta Luego");
}
}
}
}
这是我的学生 class
package prueba;
import java.io.Serializable;
public class Estudiantes implements Serializable{
String nombre, apellido;
int numero;
}
谢谢
当您尝试打印 class 并回读您之前编写的对象时,您必须从对象 class 实现 toString() 方法,这就是我的意思。
将您的 class 更改为:
public class Estudiantes implements Serializable {
private static final long serialVersionUID = 123L; // has to be unique
String nombre, apellido;
int numero;
@Override
public String toString() {
System.out.println("first name: " + nombre);
System.out.println("last name: " + apellido);
System.out.println(numero);
return // a string you want to print
}
}
I do not get the values that were entered, but something along the lines of prueba.Estudiantes@1bd7848
这就是在 class 未覆盖的对象上显式或隐式调用 toString()
时得到的结果。
这并不能证明你有问题。
我想如果你得到像 prueba.Estudiantes@1bd7848 这样的值,你就是它已经被反序列化了。您只需正确覆盖 toString() 即可获得输出。不确定这是否有帮助
我知道这个问题以前有人回答过,但是我怎么努力都找不到答案。 我正在尝试序列化和反序列化 Java 中的对象。我在反序列化中遇到问题。我没有得到输入的值,而是 prueba.Estudiantes@1bd7848 的内容。为什么我得到的是这个而不是输入的实际值?
这是我的代码
package prueba;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Prueba {
public static void main(String[] args) throws FileNotFoundException,IOException, ClassNotFoundException {
File file = new File("f.txt");
List <Estudiantes> lista = new ArrayList<>();
boolean continuar = true;
while (continuar == true){
Estudiantes es = new Estudiantes();
System.out.println("Ingrese nombre");
Scanner kb = new Scanner(System.in);
es.nombre = kb.nextLine();
System.out.println("Ingrese Apellido");
Scanner kb1 = new Scanner(System.in);
es.apellido = kb1.nextLine();
System.out.println("Ingrese Número");
Scanner kb2 = new Scanner(System.in);
es.numero = kb2.nextInt();
lista.add(es);
FileOutputStream fo = new FileOutputStream(file);
ObjectOutputStream output = new ObjectOutputStream(fo);
for (Estudiantes est: lista){
output.writeObject(est);
}
output.close();
fo.close();
FileInputStream fi = new FileInputStream(file);
ObjectInputStream input = new ObjectInputStream(fi);
ArrayList<Estudiantes> est2 = new ArrayList<Estudiantes>();
try {
while (true){
Estudiantes s = (Estudiantes)input.readObject();
est2.add(s);
}
}
catch (EOFException ex){}
for (Estudiantes s :est2){
System.out.println(s);
fi.close();
input.close();
}
System.out.println("0 para salir; 1 para continuar");
Scanner kb3 = new Scanner(System.in);
int rev = kb3.nextInt();
if (rev == 0){
continuar = false;
System.out.println("Hasta Luego");
}
}
}
}
这是我的学生 class
package prueba;
import java.io.Serializable;
public class Estudiantes implements Serializable{
String nombre, apellido;
int numero;
}
谢谢
当您尝试打印 class 并回读您之前编写的对象时,您必须从对象 class 实现 toString() 方法,这就是我的意思。 将您的 class 更改为:
public class Estudiantes implements Serializable {
private static final long serialVersionUID = 123L; // has to be unique
String nombre, apellido;
int numero;
@Override
public String toString() {
System.out.println("first name: " + nombre);
System.out.println("last name: " + apellido);
System.out.println(numero);
return // a string you want to print
}
}
I do not get the values that were entered, but something along the lines of prueba.Estudiantes@1bd7848
这就是在 class 未覆盖的对象上显式或隐式调用 toString()
时得到的结果。
这并不能证明你有问题。
我想如果你得到像 prueba.Estudiantes@1bd7848 这样的值,你就是它已经被反序列化了。您只需正确覆盖 toString() 即可获得输出。不确定这是否有帮助