当我在java中将一个对象序列化为XML,然后对其进行反序列化时,我无法对先前存在的内容使用我的函数。谁能解决这个问题?

当我在java中将一个对象序列化为XML,然后对其进行反序列化时,我无法对先前存在的内容使用我的函数。谁能解决这个问题?,java,serialization,xml-serialization,deserialization,Java,Serialization,Xml Serialization,Deserialization,下面是我用于我的类的代码。我已经对它进行了多次测试,如果不进行序列化和反序列化,所有函数都能正常工作 public class Library { private String libTitle; private Vector<Album> albums; public String getLibTitle() { return libTitle; } public void setLibTitle(String libT

下面是我用于我的类的代码。我已经对它进行了多次测试,如果不进行序列化和反序列化,所有函数都能正常工作

public class Library {

    private String libTitle;
    private Vector<Album> albums;

    public String getLibTitle() {
        return libTitle;
    }

    public void setLibTitle(String libTitle) {
        this.libTitle = libTitle;
}

public Vector<Album> getAlbums() {
    return albums;
}

public void setAlbums(Vector<Album> albums) {
    this.albums = albums;
}

public Library(){
}

public Library(String libTitle) {
    this.libTitle = libTitle;
    this.albums = new Vector<Album>();
    albums.trimToSize();

}


public void addAlbum(String album){
    boolean added = false;
    for (Album alb: this.getAlbums()){
        if (alb.getAlbum()==album){
            added=true;
        }
        if (added){
            break;
        }
    }
    if (!added){
        this.getAlbums().add(new Album(album));
        this.getAlbums().trimToSize();
    }
}

public void removeAlbum(String album){
    for (Album alb : this.getAlbums()){
        if (alb.getAlbum()==album){
            this.getAlbums().remove(alb);
            this.getAlbums().trimToSize();
            break;
        }
    }
}

public void addSong(String title, String author, String album){
    boolean added = false;
    for (Album alb : this.getAlbums()){
        if (alb.getAlbum()==album){
            alb.addSong(title,author);
            added=true;
        }
        if (added){
            break;
        }
    }
    if (!added){
        this.addAlbum(album);
        this.addSong(title, author, album);
    }
}

public void removeSong(String title, String author, String album){
    boolean removed = false;
    for (Album alb : this.getAlbums()){
        if (alb.getAlbum()==album){
            alb.removeSong(title);
            if(alb.getSongs().isEmpty()){
                this.getAlbums().remove(alb);
                this.getAlbums().trimToSize();
            };
            removed=true;
        }
        if (removed){
            break;
        }
    }       
}

public void save()
{
    try {
        FileOutputStream xmlos = new FileOutputStream(this.libTitle +".xml");
            XMLEncoder encoder = new XMLEncoder(xmlos);
        encoder.writeObject(this);
        encoder.close();
        xmlos.close();
        System.out.println("Done exporting a user as xml to "+this.libTitle+".xml");
    }catch(Exception e) {
        e.printStackTrace();
    }
}

public Library restore(String lib)
{
    Library newLib = null;
    try {
        System.out.println("Importing a user as xml from "+lib+".xml");
        FileInputStream inFileStream = new FileInputStream(lib +".xml");
        XMLDecoder decoder = new XMLDecoder(inFileStream);
        newLib = (Library)decoder.readObject();
        decoder.close();
        inFileStream.close();
        System.out.println("Libloaded "+ newLib.getLibTitle());
        return newLib;

    }catch(Exception e) {
        e.printStackTrace();
    }
    return newLib;

}

}
所以,基本上这是一个库,我正在序列化为XML,然后为我正在制作的应用程序反序列化。我的问题是运行以下代码时

public class Run {


public static void main(String args[]){
    Library lib = new Library("MYLibrary");
    lib.addSong("Crawling", "Lincoln Park", "Hybrid Theory");
    lib.addSong("In The End", "Lincoln Park", "Hybrid Theory");
    lib.addSong("Fire", "Pyros", "Burning Up");
    lib.addSong("Ocean", "Drowners", "Burning Up");
    lib.save();
    Library lib2 = new Library();
    lib2 =lib2.restore("MYLibrary");
    lib2.setLibTitle("test");
    lib2.removeSong("In The End", "Lincoln Park", "Hybrid Theory");
    lib2.addSong("Crawling in the dark", "me", "Hybrid Theory");
    lib2.removeSong("Crawling in the dark", "me", "Hybrid Theory");
    lib2.removeSong("Ocean", "Drowners", "Burning Up");
    lib2.removeAlbum("Hybrid Theory");
    lib2.save();

}

}

保存的XML文件并不是只有一首歌,而是两个生成的XML文件应该是相同的。我的老师不明白为什么它不起作用,我也不明白。为什么库没有更改?

您正在使用
==
而不是
.equals()
比较专辑和歌曲标题。如果对象被序列化和反序列化,这将不起作用,因为对象引用将发生更改

更一般地说,在大多数情况下,您应该将字符串与
.equals()
进行比较,而不是与
=
进行比较。例如:

new String("test") == "test"
将计算为
false
。有关更多解释,请参阅


如果你的专辑和歌曲类超过了
.equals()
hashcode()
方法,那就更好了,这样你就可以直接比较它们,而不必提取它们的标题并进行比较。

所有进行字符串比较的方法都使用
=
代替
equals()
<代码>=运算符比较对象实例。由于两个对象实例不相同,因此在所有情况下都返回
false
。更新方法以使用正确的比较方法,例如,应更新removeAlbum方法,如下所示:

public void removeAlbum(String album) {
    for (Album alb : this.getAlbums()) {
        if (alb.getAlbum().equals(album)) {
            this.getAlbums().remove(alb);
            this.getAlbums().trimToSize();
            break;
        }
    }
}

我还建议在类定义中实现(重写)
equals
方法。这有助于在类中添加更多属性。

哇,这就解决了问题,我真不敢相信我没听清楚,谢谢。)
new String("test") == "test"
public void removeAlbum(String album) {
    for (Album alb : this.getAlbums()) {
        if (alb.getAlbum().equals(album)) {
            this.getAlbums().remove(alb);
            this.getAlbums().trimToSize();
            break;
        }
    }
}