Java 无法反序列化所有对象的ArrayList-仅反序列化第一个对象

Java 无法反序列化所有对象的ArrayList-仅反序列化第一个对象,java,deserialization,Java,Deserialization,有很多java序列化/反序列化问题,但我找不到问题的答案。我运行GUI,三个音乐对象在运行时存储在ArrayList中(预编码): 下面是Music.java类(尽管我认为应该假设这个类的编码正确): 问题在于文件。最初,我尝试使用music.ser并创建了一个GUI,并尝试从GUI中添加两位艺术家,以及上面提供的三位艺术家 我试着对它们进行序列化和反序列化,结果很顺利。后来我尝试从GUI中添加另一个元素,而在序列化和反序列化时,我发现它没有正确序列化 后来,我将文件名改为test.ser,当我

有很多java序列化/反序列化问题,但我找不到问题的答案。我运行GUI,三个音乐对象在运行时存储在ArrayList中(预编码):

下面是Music.java类(尽管我认为应该假设这个类的编码正确):


问题在于文件。最初,我尝试使用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.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.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.ObjectInputStream;
导入java.io.ObjectOutputStream;
导入java.util.ArrayList;
公共类TestSerialization{
公共静态ArrayList serializeAndDeserialize(ArrayList musicList)引发异常{
musicList.add(新音乐(“金属舞曲”、“木偶大师”);
musicList.add(新音乐(“Pantera”、“远超驱动”);
音乐列表添加(新音乐(“Kognitif”,“灵魂食物”);
//序列化方法
试一试{
文件f=新文件(“test.ser”);
如果(f.exists()){
f、 删除();
}
FileOutputStream fos=新的FileOutputStream(“test.ser”,true);
ObjectOutputStream oos=新的ObjectOutputStream(fos);
oos.writeObject(musicList);
oos.close();
fos.close();
音乐(m:musicList){
System.out.println(“AddMusic:+m”);
}
}捕获(ioe异常ioe){
ioe.printStackTrace();
}
//反序列化方法
ArrayList MusicList 2=新的ArrayList();
试一试{
FileInputStream fis=新的FileInputStream(“test.ser”);
ObjectInputStream ois=新ObjectInputStream(fis);
musicList2=(ArrayList)ois.readObject();
ois.close();
fis.close();
音乐(m:MusicList 2){
System.out.println(“阅读音乐:\n”+m.getArtist()+“-”+m.getAlbum());
}               
}
捕获(例外情况除外){
例如printStackTrace();
}
返回musicList2;
}
}

使用生成的版本UID,同时删除toString()方法并尝试一下,而不是使用默认的SerialAversionUID。这也不起作用。老实说,我不明白为什么会这样。@mahadevkalyansrikanth这些毫无意义的建议你的理由是什么?”GUI“怎么做?”?为什么
Music
JTextArea
字段?您是否希望它被序列化和反序列化,并神奇地出现在GUI中的某个地方?不会的。我怀疑它是否应该存在,但如果它应该存在,它肯定应该是
volatile
@user207421:通过在JTextFields中输入艺术家和相册从GUI添加的。音乐课上的JTextArea错误地出现了-我在复制了一些代码后忘记删除它。我不希望它神奇地出现在GUI中。我只想反序列化.ser文件中的所有对象。那我就知道怎么处理了。他不需要
exists()/delete()
code。在构造
FileOutputStream
时,他只需要去掉append参数
true
。您不能附加到对象流。@mahadev kalyan srikanth:谢谢。谢谢你。
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.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;
    }

}