Java ArrayList序列化问题

时间:2015-12-19 15:09:10

标签: java serialization

这是我第一次进行序列化/去异步化时,我遇到了一个我无法理解的问题。 所以我有一个员工班:

public class Employee implements Serializable{

private static final long serialVersionUID = -8987739485808870716L;
public  String firstName; 
public String lastName;
public int phoneNumber;
public ArrayList<Skill> empSkillAry = new ArrayList<Skill>(); //

技能课程:

   public class Skill implements Serializable {

private static final long serialVersionUID = 4862257193587272698L;
public int skillID;
public String skillName;

日程安排课程:

    public class Schedule implements Serializable {

private static final long serialVersionUID = 781243452337862636L;
String Name;
int CsID;
public ArrayList<Skill> skillRequiredAry = new ArrayList<Skill>();

为empSkillAry和skillRequiredAry添加技能对象。如果empSkillAry包含所有skillRequiredAry对象,则可以将员工分配给班次。 让我们说,员工有技能1和时间表也有技能1.在序列化之前比较两个数组我得到一个肯定的结果,但是在反序列化后它是负面的。 我的序列化和反序列化代码有什么问题吗? 这是:

private static   void deserializeAry(ArrayList arrayToDesirialize,  String filePath){
    try {
        FileInputStream fileIn = new FileInputStream(filePath);
        ObjectInputStream in = new ObjectInputStream(fileIn);
        arrayToDesirialize = (ArrayList) in.readObject();
        System.out.println(arrayToDesirialize);

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

private static void serializeAry(ArrayList arrayToSerialize, String filePath){
    try {
        FileOutputStream fileOut = new FileOutputStream(filePath);
        ObjectOutputStream out = new ObjectOutputStream(fileOut);
        System.out.println(arrayToSerialize.toString());
        out.writeObject(arrayToSerialize);
        fileOut.close();
        out.close();


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

2 个答案:

答案 0 :(得分:4)

您的技能等级没有&#39;等于()&#39;&#39;方法。当您向两个列表添加技能时,它们都包含相同的对象,但在反序列化后它们包含具有相同内容的不同对象!如果你实现一个equals方法并与之比较而不是==它应该工作

答案 1 :(得分:2)

我假设您正在将这些数组写入不同的文件?这意味着在反序列化时将获得不同的对象。即,两个数组中的Skill个对象都不是同一个对象。假设您实现了这种方法,它们应该是.equals

BTW,在你的调试器中你应该能够看到对象的id号是不同的,即使内容是相同的。