只要你有多對多的關係,你需要有一些存儲來存儲所有的數據(如數據庫)。恕我直言,最好的辦法是讓你列出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
類相同數據的多個實例的缺點。爲了優化這個,我建議你將存儲條目作爲臨時成員並分別序列化。
非常感謝您的回答。但我沒有任何類型的存儲,除了我想要序列化其中的這些對象的文件,並且我不得不在Book類中將列表作爲Author對象的列表,並將Author類中的列表作爲Book對象列表。 我認爲,也許我可以按照上面的說明使這些列表中的一個變爲transient,並且在還原我的serialisable時,還原可序列化列表中的瞬態列表項目。 – Amal
@Amal,我認爲只列出其中一個列表是暫時的,這不是一個好的解決方案。檢查我的編輯,我添加了替代實現。 – Oleksandr
執行情況很明確:)。但是,爲什麼只列出其中的一個列表並不是一個好的解決方案? – Amal