当我在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;
}
}
}