[英]Serializing an object which contains a list of other objects
背景 :我正在實現一個游戲,該游戲需要序列化模型對象(事件),以便能夠通過網絡將其發送給玩游戲的客戶端。
問題 :我的一個模型類是EventShowCards
,其子類Event
(聲明為序列化)。
public class EventShowCards extends Event {
private final Player player;
private final List<ItemCard> cards;
public EventShowCards(Player player, List<ItemCard> cards) {
super();
this.player = player;
this.cards = cards;
}
public Player getPlayer() {
return player;
}
public List<ItemCard> getCards() {
return cards;
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
但是,當我序列化對象並將其發送給客戶端時,客戶端會接收到該對象,並且ItemCard
的列表為空。 沒有異常被拋出 。
服務器顯示的事件(序列化之前):
客戶端顯示的事件(序列化后):
為了序列化/反序列化,我使用標准的ObjectOutputStream / ObjectInputStream
有人對這里可能發生的事情有任何想法嗎? 謝謝。
編輯
根據要求,我要發布ItemCard(和Card)的代碼:
ItemCard.java
public abstract class ItemCard extends Card {
/**
* By default a card ca be played independently from the game state, subclasses that have more complicated rules
* must override this method.
*/
public boolean canBePlayed(GameStateTurn gameState) {
return true;
}
protected void emitEventCardPlayed(Player cardPlayer, GameState gameState) {
notifyObservers(new EventCardPlayed(cardPlayer, this));
}
}
Card.java
public abstract class Card extends ConcreteObservable<Event> implements CardBehavior, Serializable {
protected Deck<? extends Card> deck; // The deck to which this card belongs
public Card() {
super();
}
public void setDeck(Deck<? extends Card> deck) {
this.deck = deck;
}
public void discard() {
deck.discard(this);
}
@Override
public void preEffect(Player cardPlayer, GameState gameState) {
// By default cards have no preEffects
}
@Override
public void postEffect(Player cardPlayer, GameState gameState) {
// By default after a card is played it is discarded
discard();
}
@Override
public String toString() {
String className = this.getClass().getSimpleName();
return cardNameFromClassName(className);
}
private String cardNameFromClassName(String className) {
StringBuilder sb = new StringBuilder();
for (Character c: className.toCharArray()) {
if (Character.isUpperCase(c)) {
sb.append(" ").append(Character.toLowerCase(c));
} else {
sb.append(c);
}
}
return "\"" + sb.substring(1) + "\"";
}
}
編輯2
和Deck.java
public class Deck<T extends Card>
extends ConcreteObservable<Event>
implements Observer<Event>, Serializable {...}
編輯3
用於初始化EventShowCards的項目卡列表是從我的應用程序的另一個模型對象創建的列表,按原樣傳遞。 創建另一個ArrayList(復制該對象)以某種方式解決了我的問題。
該列表可以包含無限數量的對象類型。
當您將EventShowCards
序列化(通過Event
類)時,還需要強制將ItemCard
類可序列化,以便在正確需要時進行編組ItemCard
組。
java.util.List
沒有實現Serializable,這就是為什么列表沒有序列化的原因。
使用其他可序列化的集合,例如ArrayList
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.