Java 实现可迭代的类的Android上下文不可序列化困境

Java 实现可迭代的类的Android上下文不可序列化困境,java,android,serialization,Java,Android,Serialization,这是我的情况。我编写了一个Playlist类来存储上下文。Playlist有9个子类。不幸的是,要在意图之间传递播放列表,它必须实现可序列化。这是一个问题,因为Playlist存储上下文,因此迭代器可以工作,因为必须从迭代器重写的迭代器方法不能接受任何参数。因此,我必须将上下文存储在某个位置,因为需要它来确定播放列表的大小。这是(简化的)代码 public抽象类Playlist实现可序列化、可编辑 { 私有静态最终长serialVersionUID=0L; 私人语境; 公共上下文getConte

这是我的情况。我编写了一个Playlist类来存储上下文。Playlist有9个子类。不幸的是,要在意图之间传递播放列表,它必须实现可序列化。这是一个问题,因为Playlist存储上下文,因此迭代器可以工作,因为必须从迭代器重写的迭代器方法不能接受任何参数。因此,我必须将上下文存储在某个位置,因为需要它来确定播放列表的大小。这是(简化的)代码

public抽象类Playlist实现可序列化、可编辑
{
私有静态最终长serialVersionUID=0L;
私人语境;
公共上下文getContext(){return Context;}
公共播放列表(上下文)
{
this.context=上下文;
}
public abstract int size();//在所有当前编写的子级中引用了getContext()
公共抽象歌曲getSong(int索引);//在所有当前编写的子级中引用getContext()
@凌驾
公共播放迭代器迭代器()
{
返回新的播放列表迭代器();
}
公共类迭代器实现迭代器
{
私有电流;
播放迭代器()
{
电流=0;
}
@凌驾
公共布尔hasNext()
{
return current
我已经读到,您可以存储静态上下文,但这是糟糕的设计。我似乎找不到解决这个问题的办法

我考虑过添加一个静态上下文引用,该引用在writeObject中分配,然后在readObject中访问,因为转换应该几乎是即时的,因为序列化实现只是为了能够在意图中传递播放列表。但即使这样也感觉不舒服

对于无法序列化上下文这一事实,是否有共同的解决办法?我的解决方案在稳定性方面可以接受吗?这可能违反规定,但在这种情况下,你有什么建议

我已经编写了一个播放列表类来存储上下文

那可能不是个好主意

不幸的是,要在意图之间传递播放列表,它必须实现可序列化

它可能是可包裹的,但这并不能解决您的问题。
上下文
不能进入
可序列化
可打包

因为Playlist存储上下文,所以迭代器可以工作

那可能不是个好主意

因此,我必须将上下文存储在某个位置,因为需要它来确定播放列表的大小

或者,
播放列表
可以容纳播放列表的大小。
int
很容易与
可序列化
可打包
一起使用

或者,去掉
迭代器
,因为这对
Serializable
Parcelable
都不起作用

我似乎找不到解决这个问题的办法

播放列表
设置为纯模型对象,不包含
上下文

或者,根据使用情况,使用
应用程序作为
上下文,将
播放列表
设置为单例。目前尚不清楚播放列表是只有一个还是几个

但在这种情况下,你的建议是什么


播放列表
不应包含
上下文
,也不应包含
迭代器

尝试将逻辑与数据分开。然后,您可以发送数据而不出现问题。不幸的是,无法在构造函数中确定播放列表的大小。它是从光标大小读取的,直到需要时才生成。
public abstract class Playlist implements Serializable, Iterable<Song>
    {
        private static final long serialVersionUID = 0L;

        private Context context;
        public Context getContext() { return context; }

        public Playlist(Context context)
        {
            this.context = context;
        }

        public abstract int size(); //getContext() referenced in all currently written children
        public abstract Song getSong(int index); //getContext() referenced in all currently written children

        @Override
        public PlaylistIterator iterator()
        {
            return new PlaylistIterator();
        }

        public class PlaylistIterator implements Iterator<Song>
        {
            private int current;

            PlaylistIterator()
            {
                current = 0;
            }

            @Override
            public boolean hasNext()
            {
                return current < size(); //SIZE HERE needs access to a context, but this method certainly can not take one, and neither can the constructor above.**
            }

            @Override
            public Song next()
            {
                if (!hasNext())
                    throw new NoSuchElementException();

                return getSong(current++);
            }

            @Override
            public void remove()
            {
                throw new UnsupportedOperationException();
            }
        }
    }