2013-10-22 61 views
0

在我的代碼中,我有兩個類,它們包含彼此的實例,它們都是Parcelable。Circular Pacelables

有一個「服務器」類,它可以擁有多個「通道」類。我試圖確定的是我寫了一個無限循環到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對象都包含此反向引用。

問題:這個代碼只要循環無限地創建包裹,只要它告訴做第一個包裹,或者它實際上是安全的。

回答

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可以設置爲服務器實例讀取包裹

(很抱歉的僞代碼,但你應該明白我的意思)

+1

該工程相當。好。不要打擾在通道對象內部放置服務器引用,只是在之後重新分配它。 – Nevyn