我正在学习Java并运行一些问题来恢复对象中的序列化数据。我编写此代码尝试尝试应用于另一个项目,但对象数据返回为null。
输出示例: 序列化数据保存在item.ser中 文件存在!!! 反序列化的项目...... 项目@ 7ef20235 Sku:0 名称:null 价格:0.0 征税:null 数量:0
import java.io.*;
public class demo {
public static void main(String[] args) {
item i = new item("1234", "Guarana", 0.94, true, 1);
try {
FileOutputStream fileOut =
new FileOutputStream("item.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(i);
out.close();
fileOut.close();
System.out.println("Serialized data is saved in item.ser");
} catch (IOException e) {
e.printStackTrace();
}
try {
File F = new File("item.ser");
if (F.exists() && !F.isDirectory()) {
System.out.println("File Exist!!!");
}
FileInputStream fileIn = new FileInputStream("item.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
item restore= (item) in.readObject();
in.close();
fileIn.close();
System.out.println("Deserialized item...");
System.out.println(restore);
System.out.println("Sku: "+restore.Sku);
System.out.println("Name: "+ restore.getName());
System.out.println("Price: "+restore.Price);
/* if(ret.tax.toString()=="true"){
System.out.println("Item is taxed");
}else{
System.out.println("Item is not taxed");
}*/
System.out.println("Is taxed: "+restore.tax);
System.out.println("Quantity: "+restore.qty);
} catch (IOException err) {
err.printStackTrace();
return;
} catch (ClassNotFoundException c) {
System.out.println("Employee class not found");
c.printStackTrace();
return;
}
}
}
//class item
import java.io.Serializable;
/**
* Created by diogowatson on 26/07/17.
*/
public class item implements Serializable{
String PorN;
int Sku;
String Name;
double Price;
Boolean tax;
int qty;
public item(String s, String apple, double v, boolean b, int i) {
}
public void item(){}
public void item ( String p, int s, String n, double pr, boolean t, int q){
PorN=p;
Sku=s;
Name=n;
Price=pr;
tax=t;
qty=q;
}
public int getSku(){
return Sku;
}
public String getName(){
return Name;
}
public void PrinItem(){
System.out.println("Sku: "+ Sku);
System.out.println("name: "+ Name);
System.out.println("Price: "+Price);
System.out.println("Is taxed: "+ tax);
System.out.println("Quantity: "+qty);
}
}
答案 0 :(得分:2)
这很简单,问题与序列化本身无关。使用
创建对象item i = new item("1234", "Guarana", 0.94, true, 1);
调用item
类的构造函数。这是你的这种方法:
public item(String s, String apple, double v, boolean b, int i) {
}
如你所见,它没有设置任何东西。参数不会传递到其内部字段,因此整个item
对象为空。尝试以下内容,您可以直接看到我的意思:
item i = new item("1234", "Guarana", 0.94, true, 1);
System.out.println(i.Name) // prints null
然而,当你宣布以下内容时,你可能有点困惑:
public void item ( String p, int s, String n, double pr, boolean t, int q){
...
}
在那里你实际上正确地设置了一切。 但是这是方法,而不是item
类的构造函数(您可以通过{{1}调用此类方法例如i.item(...)
设置i
的地方。
这就是为什么命名约定建议使用大写字母和带小写字母的方法名称(也是变量/字段名称应以小写字母开头)的确切原因信),所以通常你会称之为:
item i = new item(...)
因此,解决问题唯一需要做的就是将方法的内容移动到构造函数。