2016-07-29 74 views
0

我需要說明我如何保存有另一個對象的引用的對象的狀態?使用Serializable在onSaveInstanceState中保存對象引用?

可以說我有我需要保存和恢復下面的類對象:

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還保存每個對象在mObjec TBLIST?
  2. 由於mObjectB具有對其父ObjectA的引用,是否將針對每個ObjectB重新實例化ObjectA?然後又會重新實例化ObjectB,然後它將重新實例化ObjectA等等,從而導致無限循環?
  3. 你會如何解決這個問題?

我不是當一個對象被保存爲一個序列化會發生什麼明顯的,所以請幫助我瞭解如何Android的區別時,實例化一個新的對象,什麼時候會重現實際參考。

回答

0
  1. 是的。但List不是Serializable。例如,將List更改爲ArrayList

  2. 它工作正常。 Java序列化適用於循環引用。 Here是類似的問題。

  3. 我覺得沒有問題。

我用下面的代碼測試過。

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; 
    } 
}