使用Serializable在onSaveInstanceState中保存对象引用?

时间:2016-07-29 01:33:11

标签: android serializable

我需要澄清如何保存对另一个对象有引用的对象的状态?

假设我有以下类对象需要保存和恢复:

public class ObjectA implements Serializable{
    private List<ObjectB> mObjectBList;
}

public clas ObjectB implements Serializable {
    // some other members here
    private ObjectA mParent;
}

以下是在片段中调用保存和恢复的代码:

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable("ObjectA", mObjectA);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) {
        mObjectA = (mObjectA) savedInstanceState.getSerializable("ObjectA");
    }
}

问题:

  1. 保存mObjectA还会保存mObjectBList中的每个对象吗?
  2. 由于mObjectB具有对其父ObjectA的引用,是否会为每个ObjectB重新实例化ObjectA?然后又会重新实例化ObjectB,然后它会重新实例化ObjectA,依此类推,导致无限循环?
  3. 你会如何解决这个问题?
  4. 我不清楚当一个对象被保存为Serializable时会发生什么,所以请帮助我理解Android如何区分何时实例化一个新对象以及它何时会重现一个实际的引用。

1 个答案:

答案 0 :(得分:0)

  1. 是。但List不是Serializable。例如,将List更改为ArrayList

  2. 一切正常。 Java序列化适用于循环引用。 Here是类似的问题。

  3. 我认为没有问题。

  4. 我使用以下代码进行测试。

    public class MainActivity extends AppCompatActivity {
    
        private ObjectA mObjectA;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            if (savedInstanceState != null) {
                mObjectA = (ObjectA) savedInstanceState.getSerializable("ObjectA");
                // check mObjectA == mObjectA.getObjectBList().get(0).getParent();
    
            } else {
                mObjectA = new ObjectA();
                ArrayList<ObjectB> list = new ArrayList<>();
                list.add(createB());
                list.add(createB());
                list.add(createB());
                list.add(createB());
                list.add(createB());
                mObjectA.setObjectBList(list);
            }
        }
    
        private ObjectB createB() {
            ObjectB objectB = new ObjectB();
            objectB.setParent(mObjectA);
            return objectB;
        }
    
        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putSerializable("ObjectA", mObjectA);
        }
    }
    
    public class ObjectA implements Serializable {
        private ArrayList<ObjectB> mObjectBList;
    
        public void setObjectBList(ArrayList<ObjectB> objectBList) {
            mObjectBList = objectBList;
        }
    
        public ArrayList<ObjectB> getObjectBList() {
            return mObjectBList;
        }
    }
    
    public class ObjectB implements Serializable {
        // some other members here
        private ObjectA mParent;
    
        public void setParent(ObjectA parent) {
            mParent = parent;
        }
    
        public ObjectA getParent() {
            return mParent;
        }
    }