Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否使用Serializable在onSaveInstanceState中保存对象引用?_Android_Serializable - Fatal编程技术网

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

Android 是否使用Serializable在onSaveInstanceState中保存对象引用?,android,serializable,Android,Serializable,我需要澄清如何保存对另一个对象有引用的对象的状态 假设我有以下需要保存和恢复的类对象: public class ObjectA implements Serializable{ private List<ObjectB> mObjectBList; } public clas ObjectB implements Serializable { // some other members here private ObjectA mParent; } 问题

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

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

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

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

  • 保存mObjectA是否也会保存mObjectBList中的每个对象
  • 由于mObjectB有一个对其父对象a的引用,ObjectA会为每个ObjectB重新实例化吗?然后它将重新实例化ObjectB,然后它将重新实例化ObjectA,等等,从而导致一个无限循环
  • 你将如何解决这个问题
  • 我不清楚当一个对象被保存为可序列化对象时会发生什么,所以请帮助我理解Android如何区分何时实例化一个新对象以及何时它将复制一个实际引用

  • 对。但是
    列表
    不可
    序列化
    。例如,将
    List
    更改为
    ArrayList

  • 它很好用。Java序列化适用于循环引用。 这是一个类似的问题

  • 我认为没有问题

  • 我使用以下代码进行了测试

    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;
        }
    }
    
    public类MainActivity扩展了AppCompatActivity{
    私人目标a mObjectA;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    如果(savedInstanceState!=null){
    mObjectA=(ObjectA)savedInstanceState.getSerializable(“ObjectA”);
    //检查mObjectA==mObjectA.getObjectBList().get(0.getParent();
    }否则{
    mObjectA=新对象a();
    ArrayList=新建ArrayList();
    添加(createB());
    添加(createB());
    添加(createB());
    添加(createB());
    添加(createB());
    mObjectA.setObjectBList(列表);
    }
    }
    私有对象b createB(){
    ObjectB ObjectB=新的ObjectB();
    objectB.setParent(mObjectA);
    返回对象b;
    }
    @凌驾
    SaveInstanceState上的公共无效(束超出状态){
    super.onSaveInstanceState(超出状态);
    outState.putSerializable(“ObjectA”,mObjectA);
    }
    }
    公共类ObjectA实现可序列化{
    私有数组列表mObjectBList;
    public void setObjectBList(ArrayList objectBList){
    mObjectBList=objectBList;
    }
    公共阵列列表getObjectBList(){
    返回mObjectBList;
    }
    }
    公共类ObjectB实现了可序列化{
    //这里还有其他一些成员
    私人反对权;
    public void setParent(ObjectA parent){
    mParent=父母;
    }
    public ObjectA getParent(){
    归还租金;
    }
    }
    
  • 对。但是
    列表
    不可
    序列化
    。例如,将
    List
    更改为
    ArrayList

  • 它很好用。Java序列化适用于循环引用。 这是一个类似的问题

  • 我认为没有问题

  • 我使用以下代码进行了测试

    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;
        }
    }
    
    public类MainActivity扩展了AppCompatActivity{
    私人目标a mObjectA;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    如果(savedInstanceState!=null){
    mObjectA=(ObjectA)savedInstanceState.getSerializable(“ObjectA”);
    //检查mObjectA==mObjectA.getObjectBList().get(0.getParent();
    }否则{
    mObjectA=新对象a();
    ArrayList=新建ArrayList();
    添加(createB());
    添加(createB());
    添加(createB());
    添加(createB());
    添加(createB());
    mObjectA.setObjectBList(列表);
    }
    }
    私有对象b createB(){
    ObjectB ObjectB=新的ObjectB();
    objectB.setParent(mObjectA);
    返回对象b;
    }
    @凌驾
    SaveInstanceState上的公共无效(束超出状态){
    super.onSaveInstanceState(超出状态);
    outState.putSerializable(“ObjectA”,mObjectA);
    }
    }
    公共类ObjectA实现可序列化{
    私有数组列表mObjectBList;
    public void setObjectBList(ArrayList objectBList){
    mObjectBList=objectBList;
    }
    公共阵列列表getObjectBList(){
    返回mObjectBList;
    }
    }
    公共类ObjectB实现了可序列化{
    //这里还有其他一些成员
    私人反对权;
    public void setParent(ObjectA parent){
    mParent=父母;
    }
    public ObjectA getParent(){
    归还租金;
    }
    }