序列化对象返回空Java
我正在学习Java并运行一些问题来恢复对象中的序列化数据。我编写了这段代码,尝试将其应用于另一个项目,但对象数据返回为null 输出示例: 序列化数据保存在item.ser中 文件存在!!! 反序列化项。。。 item@7ef20235 库存单位:0 名称:空 价格:0.0 已征税:空 数量:0序列化对象返回空Java,java,serialization,Java,Serialization,我正在学习Java并运行一些问题来恢复对象中的序列化数据。我编写了这段代码,尝试将其应用于另一个项目,但对象数据返回为null 输出示例: 序列化数据保存在item.ser中 文件存在!!! 反序列化项。。。 item@7ef20235 库存单位:0 名称:空 价格:0.0 已征税:空 数量:0 import java.io.*; public class demo { public static void main(String[] args) { item i =
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);
}
}
这相当简单,问题与序列化本身无关。您可以使用创建对象
item i = new item("1234", "Guarana", 0.94, true, 1);
调用项
类的构造函数。这就是你的方法:
public item(String s, String apple, double v, boolean b, int i) {
}
正如你所看到的,它没有设置任何东西。参数不会传递到它的内部字段,因此整个项
对象为空。试试下面的方法,你会直接明白我的意思:
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){
...
}
在这里,你把一切都设置正确了但是这是一个方法而不是项
类的构造函数(您可以通过i.item(…)
调用这种方法,例如,i
由项i=新项(…)
设置)
这正是命名约定建议以大写字母开头类名,以小写字母开头方法名(变量/字段名也应以小写字母开头)的确切原因,因此通常称之为:
// Class
public class Item {
// Field
String name;
// Constructor
public Item(...) {
...
}
// Method
public void item(...) {
...
}
}
因此,要解决此问题,您需要做的唯一一件事是将方法的内容移动到构造函数中编码是不干净的。类名和方法名相同。类的名称应以大写字母开头。构造函数不会在对象的字段上传递任何内容。这就是为什么会得到null。
item@7ef20235Sku:0名称:空价格:0.0已征税:空数量:0
不为空。它是一个类型为item
的对象,其内容为空。@DiogoAndrade如果用户回答了您的问题,请同时接受他的回答()。如果不超过,请说明还有什么问题没有回答,这是StackOverflow的一个非常关键的部分,非常感谢。OP的一个教训:调试时总是从简单开始。在本例中,在调查对象没有正确序列化的原因之前,您应该确认在第一种情况下它的构造是正确的。否则,这就像试图在不确定自己是否在流沙中建造房屋一样。谢谢你,扎布扎!!你给了我一个清晰、简洁的答案,也给了我关于如何改进代码的提示。这是一个愚蠢的错误,但有时我们需要别人看看我们的代码,并显示一些明显的东西。欢迎你:如果你的问题得到解决,也请考虑接受其中一个答案。这有助于从未回答的问题中筛选出您的问题。