序列化对象返回空Java

序列化对象返回空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 =

我正在学习Java并运行一些问题来恢复对象中的序列化数据。我编写了这段代码,尝试将其应用于另一个项目,但对象数据返回为null

输出示例: 序列化数据保存在item.ser中 文件存在!!! 反序列化项。。。 item@7ef20235 库存单位:0 名称:空 价格:0.0 已征税:空 数量: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);
    }
}

这相当简单,问题与序列化本身无关。您可以使用创建对象

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的一个教训:调试时总是从简单开始。在本例中,在调查对象没有正确序列化的原因之前,您应该确认在第一种情况下它的构造是正确的。否则,这就像试图在不确定自己是否在流沙中建造房屋一样。谢谢你,扎布扎!!你给了我一个清晰、简洁的答案,也给了我关于如何改进代码的提示。这是一个愚蠢的错误,但有时我们需要别人看看我们的代码,并显示一些明显的东西。欢迎你:如果你的问题得到解决,也请考虑接受其中一个答案。这有助于从未回答的问题中筛选出您的问题。