【问题标题】:Proper way to Serialize/Deserialize a custom linked list in java?在java中序列化/反序列化自定义链表的正确方法?
【发布时间】:2017-03-14 05:50:31
【问题描述】:

我正在向我的数据库项目添加序列化,但我在理解如何反序列化我的链表时遇到了问题。我认为我正确地对其进行了序列化,但我想对我的实现进行反馈,而且我不完全确定这是正确的方法。

我的自定义链表类报名:

/*
class which is used to create the
enrollment linked list referencing
Student and Course objects
*/
public class Enrollment implements Serializable
{
    private Student student;
    private Course course;
    private Enrollment link;

    public Enrollment(Student student, Course course)
    {
        this.student = student;
        this.course = course;
        this.link = null;
    }

    //returns student object to caller
    public Student getStudent()
    {
        return student;
    }

    //sets student field
    public void setStudent(Student student)
    {
        this.student = student;
    }

    //returns course object to caller
    public Course getCourse()
    {
        return course;
    }

    //sets course field
    public void setCourse(Course course)
    {
        this.course = course;
    }

    //returns link to caller
    public Enrollment getLink()
    {
        return link;
    }

    //sets link field
    public void setLink(Enrollment link)
    {
        this.link = link;
    }

}//end Enrollment

对于序列化,我有一个指向列表前面的对象引用,称为allEnrollment。我认为仅序列化此引用不会序列化整个列表,而只会序列化第一个节点。这是我序列化链表的方法(如果不应该这样做,请纠正我):

void saveEnrollment(String filename) throws IOException
    {
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));
        Enrollment currNode = allEnrollment;

        //iterating thru linked list and writing each object to file
        while (currNode != null)
        {
            out.writeObject(currNode);
            currNode = currNode.getLink();
        }

        out.close();
    }

假设我的saveEnrollment 方法对于序列化是正确的,我将如何正确地反序列化这个链表?我挣扎得很厉害,可以使用一些建议。我所做的所有阅读都让我更加困惑。 Enrollment 的所有成员都执行Serializable,所以我应该在那里很好。提前致谢。

编辑:

这是我从下面的好建议中添加的反序列化方法,以防其他人希望看到它以供将来参考:

    void loadEnrollment(String filename) throws ClassNotFoundException, IOException
    {
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));
        allEnrollment = (Enrollment)in.readObject();

    }

【问题讨论】:

    标签: java serialization linked-list deserialization


    【解决方案1】:

    你不需要做任何事情。只要EnrollmentStudent类是Serializable,序列化链表头部就会序列化整个链表,反序列化就会恢复整个链表。

    void saveEnrollment(String filename) throws IOException
    {
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));
        out.writeObject(allEnrollment);
        out.close();
    }
    

    【讨论】:

    • 非常感谢。那么链表的序列化会保留对内存中其他链接的引用吗?对不起,如果这是一个愚蠢的问题,我以前从未使用过序列化。
    • 是的,它保留了实体对象图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    相关资源
    最近更新 更多