2015-12-17 68 views
1

在Java中,我有類「書」和類「作者」。書和作者之間存在多對多關係。在java中使用多對多關係對兩個對象進行序列化

圖書類:

public class Book 
{ 
    int ISPN; 
    String title; 
    String description; 
    int pageCount; 
    public ArrayList<Author> Authors; 
} 

作者等級:

​​

我想序列書或作者的一個目標,但會出現無限遞歸,因爲每本書有一個列表他的相關作者,他們的相關書籍等無窮無盡。那麼如何處理這樣的情況呢?

對不起,我的英語不好。

回答

0

只要你有多對多的關係,你需要有一些存儲來存儲所有的數據(如數據庫)。恕我直言,最好的辦法是讓你列出transient,並在恢復你的序列化時從這個存儲中恢復項目。如果它真的是你的情況下的數據庫,你可以使用一些內存中的緩存,以使其更快。

[編輯]:

這裏是替換實現與存儲:

Storage.java

public class Storage implements Serializable { 
    private final HashMap<Integer, Book> books; 
    private final HashMap<Integer, Author> authors; 

    public Storage() { 
     books = new HashMap<>(); 
     authors = new HashMap<>(); 
    } 

    public void addBook(Book book) { 
     books.put(book.ISPN, book); 
    } 

    public void removeBook(Book book) { 
     books.remove(book.ISPN); 
    } 

    public void addAuthor(Author author) { 
     authors.put(author.authorID, author); 
    } 

    public void removeAuthor(Author author) { 
     authors.remove(author.authorID); 
    } 

    public Author getAuthor(Integer authorId) { 
     return authors.get(authorId); 
    } 

    public Book getBook(Integer bookId) { 
     return books.get(bookId); 
    } 
} 

Book.java

public class Book implements Serializable { 
    int ISPN; 
    String title; 
    String description; 
    int pageCount; 
    ArrayList<Integer> AuthorIds; 
    Storage storage; 

    public Book(Storage storage) { 
     this.storage = storage; 
    } 

    public void addAuthor(Author author) { 
     storage.addAuthor(author); 
     AuthorIds.add(author.authorID); 
    } 

    public List<Author> createAuthorsList() { 
     List<Author> authorList = new ArrayList<>(); 
     for (Integer authorId : AuthorIds) { 
      authorList.add(storage.getAuthor(authorId)); 
     } 
     return authorList; 
    } 
} 

Author.java

public class Author { 
    int authorID; 
    String firstName; 
    String lastName; 
    ArrayList<Integer> bookIds; 
    Storage storage; 

    public Author(Storage storage) { 
     this.storage = storage; 
    } 

    public void addBook(Book book) { 
     storage.addBook(book); 
     bookIds.add(book.ISPN); 
    } 

    public List<Book> createBooksList() { 
     List<Book> bookList = new ArrayList<>(); 
     for (Integer bookId : bookIds) { 
      bookList.add(storage.getBook(bookId)); 
     } 
     return bookList; 
    } 
} 

唯一一個(但大)使用此實現,那deserialisation後,你將有Storage類相同數據的多個實例的缺點。爲了優化這個,我建議你將存儲條目作爲臨時成員並分別序列化。

+0

非常感謝您的回答。但我沒有任何類型的存儲,除了我想要序列化其中的這些對象的文件,並且我不得不在Book類中將列表作爲Author對象的列表,並將Author類中的列表作爲Book對象列表。 我認爲,也許我可以按照上面的說明使這些列表中的一個變爲transient,並且在還原我的serialisable時,還原可序列化列表中的瞬態列表項目。 – Amal

+0

@Amal,我認爲只列出其中一個列表是暫時的,這不是一個好的解決方案。檢查我的編輯,我添加了替代實現。 – Oleksandr

+0

執行情況很明確:)。但是,爲什麼只列出其中的一個列表並不是一個好的解決方案? – Amal

相關問題