我无法在Java中序列化和反序列化对象

时间:2015-03-18 12:44:49

标签: java serialization deserialization

在Java(8)中序列化对象时遇到问题。我看到很多例子,但它们都不适合我。问题在于,在序列化时,它并没有用完整的数据来序列化对象。当我尝试反序列化时,它将所有变量读为null。我用Employee类做这个。 Serialize.java的代码:

public class Serialize {
private static ArrayList<Employee> emp = new ArrayList<Employee>();
public static void main(String[] args){
    try{

            emp.add(new Employee("Areg Hovhannisyan",5));
            emp.add(new Employee("Tigran Hakobyan",15));
            emp.add(new Employee("Shivanshu Ojha",11));
            FileOutputStream fos = new FileOutputStream("emps.emp");
            ObjectOutputStream out = new ObjectOutputStream(fos);
            out.writeObject(emp);

            out.close();
            fos.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
}
}

Employee.java:

import java.io.Serializable;
public class Employee implements Serializable {
private static int age;
private static String name;

public static int getAge() {
    return age;
}
public static void setAge(int age) {
    Employee.age = age;
}
public static String getName() {
    return name;
}
public static void setName(String name) {
    Employee.name = name;
}


public Employee(String name,int i) {
    this.name = name;
    this.age = i;
}
@Override
public String toString() {
    return "Name : " + getName() + ", Age : " + getAge();
}

}

请举例说明如何反序列化,请给出解释,因为我也想了解它是如何工作的。

4 个答案:

答案 0 :(得分:2)

这是因为您在课堂上的字段是静态的。静态是隐式瞬态的,我们不能序列化瞬态字段。

答案 1 :(得分:0)

您的代码中唯一的问题是,agename字段不应该是您想要执行的操作的静态内容...

只需删除两个static修饰符即可使用您的代码。

然后您可能应该阅读有关static修饰符的内容,以了解您的代码无法正常工作的原因。

答案 2 :(得分:0)

类的默认可序列化字段定义为非瞬态非静态字段。

Oracles Link

Here是堆栈OverFlow链接

答案 3 :(得分:0)

正如上面的评论中所提到的,静力学是隐含的短暂的。同样根据你的代码,如果变量是静态的,你的Arraylist中会有一个vaule(最后被添加)。这是静态变量的行为。

  
    

请举例说明如何反序列化

  

反序列化代码:

public static void main(String[] args) throws IOException,
        ClassNotFoundException {
    FileOutputStream fos = null;
    ObjectOutputStream out = null;
    FileInputStream fis = null;
    ObjectInputStream in = null;
    try {

        emp.add(new Employee("Areg Hovhannisyan", 5));
        emp.add(new Employee("Tigran Hakobyan", 15));
        emp.add(new Employee("Shivanshu Ojha", 11));
        fos = new FileOutputStream("emps.emp");
        out = new ObjectOutputStream(fos);
        out.writeObject(emp);

        fis = new FileInputStream("emps.emp");
        in = new ObjectInputStream(fis);
        ArrayList<Employee> empRead = (ArrayList) in.readObject();
        System.out.println(empRead.get(0));
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        out.close();
        fos.close();
    }
}