序列化对象返回null Java

时间:2017-07-27 00:22:29

标签: java serialization

我正在学习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);
    }
}

1 个答案:

答案 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(...)

因此,解决问题唯一需要做的就是将方法的内容移动到构造函数