在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();
}
}
请举例说明如何反序列化,请给出解释,因为我也想了解它是如何工作的。
答案 0 :(得分:2)
这是因为您在课堂上的字段是静态的。静态是隐式瞬态的,我们不能序列化瞬态字段。
答案 1 :(得分:0)
您的代码中唯一的问题是,age
和name
字段不应该是您想要执行的操作的静态内容...
只需删除两个static
修饰符即可使用您的代码。
然后您可能应该阅读有关static
修饰符的内容,以了解您的代码无法正常工作的原因。
答案 2 :(得分:0)
答案 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();
}
}