Java:反序列化和搜索对象时出现Arraylist序列化错误

时间:2018-10-11 10:53:22

标签: java

我的项目是关于图书馆管理系统的。 我必须将数据存储到类的对象中,然后再将其存储到arraylist 然后我要序列化数据

我具有以下功能:

  1. addBook(); -反序列化数组列表 -执行操作 -序列化数组列表
  2. deleteeBook(); -反序列化数组列表 -执行操作 -序列化数组列表
  3. modifyBok(); -反序列化数组列表 -执行操作 -序列化数组列表
  4. IssueBook(); -反序列化数组列表 -执行操作 -序列化数组列表
  5. returnBook(); -反序列化数组列表 -执行操作 -序列化数组列表

我的ArrayList:     公共静态ArrayList bookData = new ArrayList();

我用来序列化的代码:

        FileOutputStream fos = null;
        ObjectOutputStream oos = null;

        try {
            fos = new FileOutputStream("Database.ser");
            oos = new ObjectOutputStream(fos);
            oos.flush();
            oos.writeObject(bookData);
            oos.close();
            fos.close();
        }catch(Exception e){
            System.out.println("Exception Caught: "+e);
        }

我用来反序列化的代码:

    FileInputStream fis = null;
    ObjectInputStream ois = null;
    //ArrayList<Books> bookData = null;

    try {
        fis = new FileInputStream("Database.ser");
        ois = new ObjectInputStream(fis);
        bookData = (ArrayList<Library>) ois.readObject();

    }catch(Exception e){
        System.out.println("Exception Caught: "+e);
    }

我遇到了一个异常,因为BufferedReader需要是瞬态的,并且此问题已得到解决。但现在, 我认为我的序列化无法正常工作。每当我创建一本书时,我都会将其索引(对象编号)存储在一个文本文件中。 我的搜索技术都无法正常工作:ArrayIndexOutOfBounds捕获到异常。我试图做arraylist的size + 1 但这也不起作用。

My code for searching. Before this the deserialization code is there.

try{
        System.out.println("_________________Search Book_________________");
        System.out.println("Enter Title of Book to Search: ");
        String title = scan.readLine();
        for(int i=0;i<bookData.size();i++)
        {
            if(title.equalsIgnoreCase(bookData.get(i).getBookTitle()))
            {
                if(bookData.get(i).getBookId() == getObjCount())
                {
                    System.out.println("Book Found at ["+i+"]");
                    System.out.println("Displaying Book Data....");
                    System.out.println("Book Title    : "+bookData.get(i).getBookTitle());
                    System.out.println("Book Author   : "+bookData.get(i).getBookAuthor());
                    System.out.println("Book Subject  : "+bookData.get(i).getBookSubject());
                    System.out.println("Book Price    : "+bookData.get(i).getBookPrice());
                    System.out.println("No. of Copies : "+bookData.get(i).getAvailableCopies());
                    break; 
                }else{
                    System.out.println("Internal Error Caught.[1] Index Mismatch");
                    //Library.main();
                }
            }
            else{
                status=1;
            }
        }
        if(status == 1)
        {
            System.out.println("Book Not Found.");
        }

我的完整代码可在上找到:https://pastebin.com/emUc9yS6 序列化后,还有其他方法可以从数组列表中检索数据吗?

2 个答案:

答案 0 :(得分:0)

我无法发布答案,但是我会尽力为您提供代码。首先,您最好了解SOLID原则。因为如我所见,您将所有代码都放在一个类中。它与单一责任原则无关。然后,您必须将Library类拆分为Book(将代表书籍),Library(可选,取决于您的任务)和Book(或Library)服务(将与library一起使用-添加,删除,更新等书籍)。之后,您将能够测试您的代码,并且可以更快地发现错误。这只是我的观点。

答案 1 :(得分:0)

我从您的代码中识别出的两件事导致了错误:

  1. BufferedReader扫描是库的一部分,因此您尝试对其进行序列化/反序列化,从而收到错误。

  2. 您似乎从来没有在增加书号。

话虽如此,我应该按如下方式对您的媒体库进行建模:

图书馆包含书籍。

public class Book implements Serializable
{  
    private static final long serialVersionUID = 24913L; 


static int bookId=0;        // Stores ID of Books
double bookPrice;           // Stores Price of Book
int availableCopies;        // Stores Nos. of available copies
String bookTitle;           // Stores title of Books
String bookAuthor;          // Stores author of Book
String bookSubject;         // Stores Subject of Book
//StringBuffer studentName; // Stores Name of Student which issued/Returned Book.
StringBuffer issuedTo[] = new StringBuffer[1000];
//Stores all names of students which issued same book.

//Constructors
public Book()
{
    generateBookId();
}

public Book(String bookTitle, String bookAuthor, String bookSubject, double bookPrice, int availableCopies)
{
    generateBookId();
    this.bookTitle=bookTitle;
    this.bookAuthor=bookAuthor;
    this.bookSubject=bookSubject;
    this.bookPrice=bookPrice;
    this.availableCopies=availableCopies;
}

//Functions
public static int generateBookId(){
    bookId++;       //Incrementing Book Id
    return bookId;  // Returning the incremented book Id
}

public int getBookId() throws IOException{
    return bookId;
}

public double getBookPrice() throws IOException{
    return bookPrice;
}

public String getBookTitle() throws IOException{
    return bookTitle;
}

public String getBookAuthor() throws IOException{
    return bookAuthor;
}

public String getBookSubject() throws IOException{
    return bookSubject;
}

public int getAvailableCopies() throws IOException{
    return availableCopies;
}

/*public void setBookId() throws IOException{
    bookId = Integer.parseInt(scan.readLine());
}*/

public void setBookPrice(double bookPrice) throws IOException{
    this.bookPrice = bookPrice;
}

public void setBookTitle(String bookTitle) throws IOException{
    this.bookTitle = bookTitle;
}

public void setBookAuthor(String bookAuthor) throws IOException{
    this.bookAuthor = bookAuthor;
}

public void setBookSubject(String bookSubject) throws IOException{
    this.bookSubject = bookSubject;
}

public void setNoOfCopies(int availableCopies) throws IOException{
    this.availableCopies = availableCopies;
}

public void addBookCopies() throws IOException{
    availableCopies++;
}

public void removeBookCopies() throws IOException{
    availableCopies--;
}

}

图书馆如下:

public class Library implements Serializable
{  
    private static final long serialVersionUID = 24913L; //used to verify sender and reciever   

    public static ArrayList<Book> bookData = new ArrayList<Book>();


public void addBook(Book book)
{       
    try{
        objCount++;
        bookData.add(book);           
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;

        try {
            fos = new FileOutputStream("Database.ser");
            oos = new ObjectOutputStream(fos);
            oos.flush();
            oos.writeObject(bookData);
            oos.close();
            fos.close();
        }catch(Exception e){
            System.out.println("Exception Caught: "+e);
        }

    }catch(Exception e){
        System.out.println("Exception Caught: "+e);
    }finally{
        try{
            File file = new File("Books_Index.txt");
            FileWriter fw = new FileWriter(file, true);
            int count=getObjCount();
            fw.write("\nBook Index ["+count+"] Contains Book Named: ["+book.getBookTitle()+"]");
            fw.close();
            //saveData();

        }catch(Exception e){
            System.out.println("Exception Caught: "+e);
        }
    }

}

public void deleteBook(int index ,String title)
{
    //fetchData();

    FileInputStream fis = null;
    ObjectInputStream ois = null;
    //ArrayList<Books> bookData = null;

    try {
        fis = new FileInputStream("Database.ser");
        ois = new ObjectInputStream(fis);
        bookData = (ArrayList<Book>) ois.readObject();

    }catch(Exception e){
        System.out.println("Exception Caught: "+e);
    }

    int status=0;
    try{

        for(int i=0;i<bookData.size();i++)
        {
            if(title.equalsIgnoreCase(bookData.get(i).getBookTitle()))
            {
                bookData.set(bookData.indexOf(i),null);
                    //changing the value to null so that index of books would be maintained
                    // ...to avoid left shift
                    break;                    
            }
            else{
                status=1;
            }
        }
        if(status == 1)
        {
            System.out.println("Book Not Found.");
        }

        FileOutputStream fos = null;
        ObjectOutputStream oos = null;

        try {
            fos = new FileOutputStream("Database.ser");
            oos = new ObjectOutputStream(fos);
            oos.flush();
            oos.writeObject(bookData);
            oos.close();
            fos.close();
        }catch(Exception e){
            System.out.println("Exception Caught: "+e);
        }

    }catch(Exception e){
        System.out.println("Exception Caught: "+e);
    }finally{
        try{
            File file = new File("Books_Index.txt");
            FileWriter fw = new FileWriter(file, true);
            int count = getObjCount();
            fw.write("\n Book Index ["+count+"] got deleted. Book Named: ["+title+"]");
            fw.close();
            System.out.println("Delete Operation Finished.");
            //saveData();
        }catch(Exception e){
            System.out.println("Exception Caught: "+e);
        }
    }
}

public void modifyBook(int index,String title,double price,int availableCopies)
{
    //fetchData();

    FileInputStream fis = null;
    ObjectInputStream ois = null;
    //ArrayList<Books> bookData = null;

    try {
        fis = new FileInputStream("Database.ser");
        ois = new ObjectInputStream(fis);
        bookData = (ArrayList<Book>) ois.readObject();

    }catch(Exception e){
        System.out.println("Exception Caught: "+e);
    }

    int status=0;
    try{

        for(int i=0;i<bookData.size();i++)
        {
            if(title.equalsIgnoreCase(bookData.get(i).getBookTitle()))
            {                        
                    bookData.get(index).setBookPrice(price);
                    bookData.get(index).setNoOfCopies(availableCopies);                 
            }
            else{
                status=1;
            }
        }
        if(status == 1)
        {
            System.out.println("Book Not Found.");
        }

        FileOutputStream fos = null;
        ObjectOutputStream oos = null;

        try {
            fos = new FileOutputStream("Database.ser");
            oos = new ObjectOutputStream(fos);
            oos.flush();
            oos.writeObject(bookData);
            oos.close();
            fos.close();
        }catch(Exception e){
            System.out.println("Exception Caught: "+e);
        }

    }catch(Exception e){
        System.out.println("Exception Caught: "+e);
    }finally{
        System.out.println("Modify Operation Finished.");
        //saveData();
    }
}

public void searchBook(int index,String title)
{
    //fetchData();

    FileInputStream fis = null;
    ObjectInputStream ois = null;
    //ArrayList<Books> bookData = null;

    try {
        fis = new FileInputStream("Database.ser");
        ois = new ObjectInputStream(fis);
        bookData = (ArrayList<Book>) ois.readObject();

    }catch(Exception e){
        System.out.println("Exception Caught: "+e);
    }

    int status=0;
    try{

        for(int i=0;i<bookData.size();i++)
        {
            if(title.equalsIgnoreCase(bookData.get(i).getBookTitle()))
            {
                if(bookData.get(i).getBookId() == getObjCount())
                {
                    System.out.println("Book Found at ["+i+"]");
                    System.out.println("Displaying Book Data....");
                    System.out.println("Book Title    : "+bookData.get(i).getBookTitle());
                    System.out.println("Book Author   : "+bookData.get(i).getBookAuthor());
                    System.out.println("Book Subject  : "+bookData.get(i).getBookSubject());
                    System.out.println("Book Price    : "+bookData.get(i).getBookPrice());
                    System.out.println("No. of Copies : "+bookData.get(i).getAvailableCopies());
                    break;
                }else{
                    System.out.println("Internal Error Caught.[1] Index Mismatch");
                    //Library.main();
                }
            }
            else{
                status=1;
            }
        }
        if(status == 1)
        {
            System.out.println("Book Not Found.");
        }

        FileOutputStream fos = null;
        ObjectOutputStream oos = null;

        try {
            fos = new FileOutputStream("Database.ser");
            oos = new ObjectOutputStream(fos);
            oos.flush();
            oos.writeObject(bookData);
            oos.close();
            fos.close();
        }catch(Exception e){
            System.out.println("Exception Caught: "+e);
        }

    }catch(Exception e){
        System.out.println("Exception Caught: "+e);
    }finally{
        System.out.println("Search Operation Finished.");
        //saveData();
    }
}

public void issueBook(int index,String title,String studName)
{
    int status = 0;
    //fetchData();

    FileInputStream fis = null;
    ObjectInputStream ois = null;
    //ArrayList<Books> bookData = null;

    try {
        fis = new FileInputStream("Database.ser");
        ois = new ObjectInputStream(fis);
        bookData = (ArrayList<Book>) ois.readObject();

    }catch(Exception e){
        System.out.println("Exception Caught: "+e);
    }

    try{

        for(int i=0;i<bookData.size();i++)
        {
            if(title.equalsIgnoreCase(bookData.get(i).getBookTitle()))
            {
                if(bookData.get(i).getBookId() == getObjCount())
                {
                    //
                    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");  
                    LocalDateTime now = LocalDateTime.now();  
                    //
                    //Format formatter = new SimpleDateFormat("yyyy-MM-dd");
                    //String currentDate = formatter.format(date);
                    //i++;
                    bookData.get(i).removeBookCopies();
                    //i++;
                    File file = new File("issueLogs.txt");
                    FileWriter fw = new FileWriter(file, true);
                    fw.write("\n["+dtf.format(now)+"] : Book Title : "+bookData.get(i).getBookTitle()+" was Issued by Student Name"+studName);
                    fw.close();
                    break;
                }else{
                    System.out.println("Internal Error Caught.[1] Index Mismatch");
                    //Library.main();
                }
            }
            else{
                status=1;
            }
            if(status == 1)
            {
                System.out.println("353");
            }
        }
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;

        try {
            fos = new FileOutputStream("Database.ser");
            oos = new ObjectOutputStream(fos);
            oos.flush();
            oos.writeObject(bookData);
            oos.close();
            fos.close();
        }catch(Exception e){
            System.out.println("Exception Caught: "+e);
        }
    }catch(Exception e){
        System.out.println("Exception Caught: "+e);
    }finally{
        System.out.println("Issue Operation Finished.");
        //saveData();
    }
}

public void returnBook(int index,String title,String studName)
{
    int status=0;
    //fetchData();

    FileInputStream fis = null;
    ObjectInputStream ois = null;
    //ArrayList<Books> bookData = null;

    try {
        fis = new FileInputStream("Database.ser");
        ois = new ObjectInputStream(fis);
        bookData = (ArrayList<Book>) ois.readObject();

    }catch(Exception e){
        System.out.println("Exception Caught: "+e);
    }

    try{

        for(int i=0;i<bookData.size();i++)
        {
            if(title.equalsIgnoreCase(bookData.get(i).getBookTitle()))
            {
                if(bookData.get(i).getBookId() == getObjCount())
                {
                    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");  
                    LocalDateTime now = LocalDateTime.now();  
                    //Format formatter = new SimpleDateFormat("yyyy-MM-dd");
                    //String currentdate = formatter.format(date);
                    //i++;
                    bookData.get(i).addBookCopies();
                    //i++; //are yaar he ka kelela mi??
                    File file = new File("returnLogs.txt");
                    FileWriter fw = new FileWriter(file, true);
                    fw.write("\n["+dtf.format(now)+"] : Book Title : "+bookData.get(i).getBookTitle()+" was Returned by Student Name"+studName);
                    fw.close();
                }else{
                    System.out.println("Internal Error Caught.[1] Index Mismatch");
                    //Library.main();
                }
            }
            else{
                status=1;
            }
            if(status == 1)
            {
                System.out.println("Line no 402");
            }

        }
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;

        try {
            fos = new FileOutputStream("Database.ser");
            oos = new ObjectOutputStream(fos);
            oos.flush();
            oos.writeObject(bookData);
            oos.close();
            fos.close();
        }catch(Exception e){
            System.out.println("Exception Caught: "+e);
        }
    }catch(Exception e){
        System.out.println("Exception Caught: "+e);
    }finally{
        System.out.println("Return Operation Finished.");
        //saveData();
    }

}
///////////////////////////////////////////////////////////////////////////////////////////////////
public static int objCount=0;

public static int getObjCount()
{
    return objCount;
}

}

最后,您可以拥有执行所有代码的主跑步者类:

public class CreateLibrary {
    static final String username = "";
    static final String password = "";

    public static void main(String args[]) throws Exception

{
    BufferedReader scan = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Enter User Name: ");
    String enterUser= scan.readLine();
    System.out.println("Enter Password: ");
    String enterPass =scan.readLine();


    if(enterUser.equals(username) && enterPass.equals(password))
    {
        System.out.println("Login Successful...\n\n");
        Library library = new Library();

        int choice=0;
        while(choice!=7)
        {
            System.out.println("Select From Below Options: ");
            System.out.println("1. Add Book\n2. Modify Book\n3. Delete Book\n4. Search Book\n5. Issue Book\n6. Return Book\n7. LogOut");
            System.out.println("Enter Your Choice: ");
            choice = Integer.parseInt(scan.readLine());
            switch(choice)
            {
                case 1:
                    {
                        Book book = new Book();
                        System.out.println("_________________Enter Book Details_________________");
                        System.out.println(" Enter title of the Book    : ");
                        book.setBookTitle(scan.readLine());
                        System.out.println(" Enter the Name of Author   : ");
                        book.setBookAuthor(scan.readLine());
                        System.out.println(" Enter the Subject of Book  : ");
                        book.setBookSubject(scan.readLine());
                        System.out.println(" Enter the Price of Book    : ");
                        book.setBookPrice(Integer.parseInt(scan.readLine()));
                        System.out.println(" Enter Number of Copies     :");
                        book.setNoOfCopies(Integer.parseInt(scan.readLine()));                            
                        library.addBook(book);
                        break;
                    }
                case 2:
                    {
                        System.out.println("Enter Index of Book you want to Modify: ");
                        int index=Integer.parseInt(scan.readLine()); 

                        System.out.println("_________________Modify Book_________________");
                        System.out.println("Enter Title of Book to Modify: ");
                        String title = scan.readLine();

                        System.out.println("Enter New Price of Book: ");
                        double price = Double.parseDouble(scan.readLine());

                        System.out.println("Enter New Available copies of Book");
                        int availableCopies = Integer.parseInt(scan.readLine());

                        library.modifyBook(index,title,price,availableCopies);
                        break;
                    }
                case 3:
                    {
                        System.out.println("Enter Index of Book you want to Delete: ");
                        int index=Integer.parseInt(scan.readLine());

                        System.out.println("_________________Delete Book_________________");
                        System.out.println("Enter Title of Book to delete: ");
                        String title = scan.readLine();

                        library.deleteBook(index,title);
                        break;
                    }
                case 4:
                    {
                        System.out.println("Enter Index of Book you want to Search: ");
                        int index=Integer.parseInt(scan.readLine());

                        System.out.println("_________________Search Book_________________");
                        System.out.println("Enter Title of Book to Search: ");
                        String title = scan.readLine();

                        library.searchBook(index,title);
                        break;
                    }
                case 5:
                    {
                        System.out.println("Enter Index of Book you want to Issue: ");
                        int index=Integer.parseInt(scan.readLine());

                        System.out.println("_________________Issue Book_________________");
                        System.out.println("Enter Title of Book  :  ");
                        String title = scan.readLine();
                        System.out.println("Enter Name of Student:  ");
                        String studName = scan.readLine();

                        library.issueBook(index,title,studName);
                        break;
                    }
                case 6:
                    {
                        System.out.println("Enter Index of Book you want to Return: ");
                        int index=Integer.parseInt(scan.readLine());

                        System.out.println("_________________Return Book_________________");
                        System.out.println("Enter Title of Book  :  ");
                        String title = scan.readLine();
                        System.out.println("Enter Name of Student:  ");
                        String studName = scan.readLine();

                        library.returnBook(index,title,studName);
                        break;
                    }
                case 7:
                    {
                        System.exit(0);
                        break;
                    }
            }
        }
    } //if bracket
    else
    {
        System.out.println("Invalid Login Credentials. It's not that easy to get in.");
        System.out.print("Quiting...");
        Thread.sleep(800);

    }
}

}

希望有帮助。