有很多java序列化/反序列化问题,但我找不到问题的答案。我运行 GUI,三个音乐对象在运行时存储在 ArrayList 中(预编码):
private ArrayList<Music> musicList = new ArrayList<Music>();
...
musicList.add(new Music("Metallica", "Master of Puppets"));
然后我从 GUI 添加更多音乐。这些新对象也会添加到 ArrayList musicList
中(我可以通过循环 musicList
来验证这一点)。
然后我可以序列化这个 ArrayList,用记事本打开music.ser 文件并查看其中的所有对象。但我找不到一种方法来反序列化所有这些对象 - 反序列化后我得到的只是那些在运行时添加的对象加上从 GUI 添加的第一个对象。从 GUI 添加的其他对象永远不会反序列化。我不知道是否应该使用循环或缓冲区检查 music.ser
文件(我发现了类似的建议)?任何帮助将不胜感激。以下是我认为对于该问题很重要的代码行:
private ArrayList<Music> musicList;
...
musicList = new ArrayList<Music>();
musicList.add(new Music("Metallica", "Master of Puppets"));
musicList.add(new Music("Pantera", "Far Beyond Driven"));
musicList.add(new Music("Kognitif", "Soul Food"));
...
// serialization method
try {
FileOutputStream fos = new FileOutputStream("music.ser", true);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(musicList);
oos.close();
fos.close();
for (Music m : musicList) {
System.out.println("AddMusic: " + m);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
// deserialization method
ArrayList<Music> musicList2 = new ArrayList<Music>();
try {
FileInputStream fis = new FileInputStream("music.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
musicList2 = (ArrayList<Music>) ois.readObject();
ois.close();
fis.close();
for (Music m : musicList2) {
System.out.println("Reading Music: \n" + m.getArtist() + " - " + m.getAlbum());
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
这是 Music.java 类(尽管我认为应该假设这个类已正确编码):
public class Music implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String artist;
private String album;
JTextArea textArea;
public Music(String artist, String album) {
super();
this.artist = artist;
this.album = album;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getAlbum() {
return album;
}
public void setAlbum(String album) {
this.album = album;
}
@Override
public String toString() {
return artist + " - " + album + "\n";
}
}
最佳答案
问题出在文件上。最初,我尝试使用 music.ser 并创建了一个 GUI,并尝试从 GUI 添加两位艺术家以及您上面提供的三位艺术家。
我尝试对它们进行序列化和反序列化,结果很顺利。后来我尝试从 GUI 添加另一个元素,在尝试序列化和反序列化时,我发现它没有正确序列化。
后来我将文件名更改为 test.ser,当我尝试从 GUI 添加三位艺术家和从运行时添加三位艺术家时,一切正常,当我尝试从 GUI 添加第四个艺术家时,它再次失败。
您需要做的就是删除该文件(如果存在)并在序列化和反序列化时创建一个新文件。
附上示例代码。
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class TestGUI {
public static void main(String args[]) {
final ArrayList<Music> musicList = new ArrayList<Music>();
//Creating the Frame
JFrame frame = new JFrame("Chat Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
//Creating the MenuBar and adding components
JMenuBar mb = new JMenuBar();
JMenu m1 = new JMenu("FILE");
JMenu m2 = new JMenu("Help");
mb.add(m1);
mb.add(m2);
JMenuItem m11 = new JMenuItem("Open");
JMenuItem m22 = new JMenuItem("Save as");
m1.add(m11);
m1.add(m22);
//Creating the panel at bottom and adding components
JPanel panel = new JPanel(); // the panel is not visible in output
JLabel label = new JLabel("Enter Artist");
final JTextField tf = new JTextField(10); // accepts upto 10 characters
JLabel album = new JLabel("Enter Album");
final JTextField tf1 = new JTextField(10);
JButton send = new JButton("Send");
JButton reset = new JButton("Serialize");
panel.add(label); // Components Added using Flow Layout
panel.add(label); // Components Added using Flow Layout
panel.add(tf);
panel.add(album); // Components Added using Flow Layout
panel.add(tf1);
panel.add(send);
panel.add(reset);
send.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
Music m = new Music(tf.getText(), tf1.getText());
musicList.add(m);
tf1.setText("");
tf.setText("");
}
});
reset.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
try {
TestSerialization.serializeAndDeserialize(musicList);
} catch (Exception ex) {
}
}
});
//Adding Components to the frame.
frame.getContentPane().add(BorderLayout.CENTER, panel);
frame.getContentPane().add(BorderLayout.NORTH, mb);
frame.setVisible(true);
}
}
示例音乐(与您的相同)
import java.io.Serializable;
import javax.swing.JTextArea;
public class Music implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String artist;
private String album;
JTextArea textArea;
public Music(String artist, String album) {
super();
this.artist = artist;
this.album = album;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getAlbum() {
return album;
}
public void setAlbum(String album) {
this.album = album;
}
@Override
public String toString() {
return artist + " - " + album + "\n";
}
}
序列化类示例
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
public class TestSerialization {
public static ArrayList<Music> serializeAndDeserialize(ArrayList<Music> musicList) throws Exception {
musicList.add(new Music("Metallica", "Master of Puppets"));
musicList.add(new Music("Pantera", "Far Beyond Driven"));
musicList.add(new Music("Kognitif", "Soul Food"));
// serialization method
try {
File f = new File("test.ser");
if (f.exists()) {
f.delete();
}
FileOutputStream fos = new FileOutputStream("test.ser", true);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(musicList);
oos.close();
fos.close();
for (Music m : musicList) {
System.out.println("AddMusic: " + m);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
// deserialization method
ArrayList<Music> musicList2 = new ArrayList<Music>();
try {
FileInputStream fis = new FileInputStream("test.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
musicList2 = (ArrayList<Music>) ois.readObject();
ois.close();
fis.close();
for (Music m : musicList2) {
System.out.println("Reading Music: \n" + m.getArtist() + " - " + m.getAlbum());
}
}
catch (Exception ex) {
ex.printStackTrace();
}
return musicList2;
}
}
关于java - 无法反序列化所有对象的 ArrayList - 仅反序列化第一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58550112/