0

在我的代码中,我有两个类,它们包含彼此的实例,它们都是 Parcelable。

有一个“Server”类,它可以拥有多个“Channel”类。我试图确定的是我是否只是在writeToParcelandcreateFromParcel方法中编写了一个无限循环?

这是一些代码:

//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;
    }

其他一些注意事项:是的,通道内的服务器对象是对实际服务器对象的反向引用。是的,服务器内的每个 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 回答