簡體   English   中英

序列化包含其他對象列表的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM