在我的代码中,我有两个类,它们包含彼此的实例,两个都是Parcelable。
有一个“服务器”类,它可以拥有多个“通道”类。我试图确定的是,我只是在writeToParcel
和createFromParcel
方法中写了一个无限循环?
以下是一些代码:
//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 :(得分: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
然后当你恢复它时,服务器反序列化parcel,创建一个通道列表并读取每个通道;然后可以将channel.server
设置为读取包裹的服务器实例。
(抱歉伪代码,但你应该明白了)