0

私のコードには、お互いのインスタンスを含む 2 つのクラスがあり、どちらも Parcelable です。

複数の「チャネル」クラスを所有できる「サーバー」クラスがあります。私が判断しようとしているのは、メソッドwriteToParcelcreateFromParcelメソッドに無限ループを書き込んだだけですか?

ここにいくつかのコードがあります:

//Server implementations
public void writeToParcel(Parcel dest, int flags) {
    dest.writeStringArray(new String[] {
            NAME, 
            PASS, 
            PORT, 
            NICK, 
            ALT_NICK, 
            START_CHANNEL, 
            PORT, 
            WindowText});
    Bundle channelBundle = new Bundle();
    channelBundle.putParcelableArray("Channels", Channels);
    dest.writeBundle(channelBundle);
}
//...
public IRCServer createFromParcel(Parcel in)
    {
        IRCServer ret = new IRCServer();
        String[] Data = new String[8];
        in.readStringArray(Data);
        ret.NAME = Data[0];
        ret.PASS = Data[1];
        ret.PORT = Data[2];
        ret.NICK = Data[3];
        ret.ALT_NICK = Data[4];
        ret.START_CHANNEL = Data[5];
        ret.PORT = Data[6];
        ret.WindowText = Data[7];

        Bundle cBund = in.readBundle();
        ret.Channels = (IRCChannel[])cBund.getParcelableArray("Channels");

        return ret;
    }

//Channel Implementation
public void writeToParcel(Parcel dest, int flags) {
    dest.writeStringArray(new String[] {
        Name,
        WindowText
    });
    dest.writeStringList(UserList);
    Bundle ServerBundle = new Bundle();
    ServerBundle.putParcelable("Server", server);
    dest.writeBundle(ServerBundle);
}
//...
public IRCChannel createFromParcel(Parcel in)
    {
        IRCChannel ret = new IRCChannel();
        String[] Data = new String[2];
        in.readStringArray(Data);
        ret.Name = Data[0];
        ret.WindowText = Data[1];
        in.readStringList(ret.UserList);
        Bundle ser = in.readBundle();
        ret.server = (IRCServer)ser.getParcelable("Server");
        return ret;
    }

その他の注意事項: はい、チャネル内の Server オブジェクトは、実際のサーバー オブジェクトへの後方参照です。はい、サーバー内の各 Channel オブジェクトには、この後方参照が含まれています。

質問: このコードは、最初のパーセルを実行するように指示されるとすぐに無限にループしてパーセルを作成するだけですか、それとも実際には安全ですか?

4

1 に答える 1

0

常に複数のチャネルを所有するサーバーである場合 (チャネルが複数のサーバーによって所有されていない場合は、関連するチャネルを含むサーバーのみを作成する必要があります。

Server.writeToParcel:
    - write server identifier (name, fqdn, etc)
    - write user list
    - write channel count
    - for each channel: write channel

Channel.writeToParcel:
    - write channel name
    - write channel info

次に、これを復元すると、サーバーはパーセルを逆シリアル化し、チャネルのリストを作成して、各チャネルを読み取ります。channel.serverその後、パーセルを読み取るサーバー インスタンスに設定できます。

(疑似コードで申し訳ありませんが、アイデアを得る必要があります)

于 2013-10-22T21:45:38.940 に答える