在Java中序列化和反序列化多个对象

在Java中序列化和反序列化多个对象,java,serialization,Java,Serialization,以下是我的应用程序需要如何工作的步骤。 启动应用程序后: 它需要继续接受来自用户的字符串形式的输入 一旦我得到任何输入,我需要序列化它 之后,我需要反序列化文件中存储的所有对象,这样我就不会丢失文件中存储的先前序列化对象 如何实施?每次我只能反序列化最后出现的一个对象。下面是我用于单输入的代码。我无法将所有输入转换为单个对象,因为我的应用程序需要持续运行一整天,并且它必须随时接受输入 用于序列化的代码 import java.io.FileOutputStream; import java.io

以下是我的应用程序需要如何工作的步骤。

启动应用程序后:

  • 它需要继续接受来自用户的字符串形式的输入

  • 一旦我得到任何输入,我需要序列化它

  • 之后,我需要反序列化文件中存储的所有对象,这样我就不会丢失文件中存储的先前序列化对象

  • 如何实施?每次我只能反序列化最后出现的一个对象。下面是我用于单输入的代码。我无法将所有输入转换为单个对象,因为我的应用程序需要持续运行一整天,并且它必须随时接受输入

    用于序列化的代码

    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.util.Scanner;
    
    public class Dummyserial implements Serializable {
    
        /**
         * @param args
         */
        String input;   
        public void work()
    
        {       System.out.println("give an input");
                Scanner user_input = new Scanner( System.in );
                input=user_input.next( );
    
        }
        public static char sa='n';
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            System.out.println("pree Y to continue or N to exit");
            Scanner flag= new Scanner(System.in);
            sa=flag.next().charAt(0);
    
    if (sa=='y'){
            Dummyserial obj=new Dummyserial();
            try{
                         FileOutputStream fileOut =new FileOutputStream("C:/Workouts/DummyStrng.ser");
                         ObjectOutputStream out = new ObjectOutputStream(fileOut);
                         obj.work();
                         out.writeObject(obj);
                         out.close();
                         fileOut.close();
                         System.out.printf("Serialized data is saved in C:/Workouts/Strng.ser");
                }
                catch(IOException i)
                  {
                      i.printStackTrace();
                  }
            }}
        }
    
    import java.io.FileInputStream;
    import java.io.ObjectInputStream;
    
    import java.io.IOException;
    
    public class DummyDeserial {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Dummyserial obj=null;
             try
              {
                 FileInputStream fileIn = new FileInputStream("C:/Workouts/DummyStrng.ser");
                 ObjectInputStream in = new ObjectInputStream(fileIn);
                 obj = (Dummyserial) in.readObject();
                 in.close();
                 fileIn.close();
              }catch(IOException i)
              {
                 i.printStackTrace();
                 return;
              }catch(ClassNotFoundException c)
              {
                 System.out.println("Employee class not found");
                 c.printStackTrace();
                 return;
              }
    
    
            System.out.printf("%s",obj.input);
            System.out.println();
    
            }
    
        }
    
    反序列化代码

    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.util.Scanner;
    
    public class Dummyserial implements Serializable {
    
        /**
         * @param args
         */
        String input;   
        public void work()
    
        {       System.out.println("give an input");
                Scanner user_input = new Scanner( System.in );
                input=user_input.next( );
    
        }
        public static char sa='n';
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            System.out.println("pree Y to continue or N to exit");
            Scanner flag= new Scanner(System.in);
            sa=flag.next().charAt(0);
    
    if (sa=='y'){
            Dummyserial obj=new Dummyserial();
            try{
                         FileOutputStream fileOut =new FileOutputStream("C:/Workouts/DummyStrng.ser");
                         ObjectOutputStream out = new ObjectOutputStream(fileOut);
                         obj.work();
                         out.writeObject(obj);
                         out.close();
                         fileOut.close();
                         System.out.printf("Serialized data is saved in C:/Workouts/Strng.ser");
                }
                catch(IOException i)
                  {
                      i.printStackTrace();
                  }
            }}
        }
    
    import java.io.FileInputStream;
    import java.io.ObjectInputStream;
    
    import java.io.IOException;
    
    public class DummyDeserial {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Dummyserial obj=null;
             try
              {
                 FileInputStream fileIn = new FileInputStream("C:/Workouts/DummyStrng.ser");
                 ObjectInputStream in = new ObjectInputStream(fileIn);
                 obj = (Dummyserial) in.readObject();
                 in.close();
                 fileIn.close();
              }catch(IOException i)
              {
                 i.printStackTrace();
                 return;
              }catch(ClassNotFoundException c)
              {
                 System.out.println("Employee class not found");
                 c.printStackTrace();
                 return;
              }
    
    
            System.out.printf("%s",obj.input);
            System.out.println();
    
            }
    
        }
    

    因此,您需要附加到该文件。您正在覆盖它。或者,将对象保存在列表中并一次写入文件。@但是我想一个接一个地处理我的输入。我不希望我的输入一次全部存储在列表中。如果不覆盖以前的对象,管理是不可能的。只需在程序的生命周期内保持
    FileOutputStream
    ObjectOutputStream
    打开即可,而不是为每个要序列化的对象创建新对象@ScaryWombat在不采取特殊措施的情况下,您不能仅仅附加到序列化对象的文件中。