Java Android何时序列化对象?
我正在从事一个Android项目,我想将一个自定义类Java Android何时序列化对象?,java,android,android-fragments,serialization,pass-by-reference,Java,Android,Android Fragments,Serialization,Pass By Reference,我正在从事一个Android项目,我想将一个自定义类MainActivityModel传递给Fragment,MainActivityPlaceholderFragment 我已使MainActivityModel可序列化: public class MainActivityModel implements Serializable{ public int current = 0; public int pageCount = 0; public boolean pr
MainActivityModel
传递给Fragment
,MainActivityPlaceholderFragment
我已使MainActivityModel
可序列化:
public class MainActivityModel implements Serializable{
public int current = 0;
public int pageCount = 0;
public boolean pristine = true;
// Stores the fetched dataMap
public ArrayList<HashMap<String, String>> arrayList;
public MainActivityModel() {
this.arrayList = new ArrayList<>();
}
public String getCategory() {
return Util.categories[current];
}
public CharSequence getmTitle () {
return Util.toTitleCase(
Util.mapCategoryPretty(Util.categories[current]));
}
}
我是这样访问它的:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainActivityModel = (MainActivityModel) getArguments().getSerializable(ARG_DATA_MODEL);
mMainActivityPlaceholderFragmentView = new MainActivityPlaceholderFragmentView(this, mainActivityModel);
mCallbacks.onPlaceholderFragmentCreated(mainActivityModel.current);
}
我最初认为(在阅读了下面提到的答案之后),序列化将数据转换为字节,并在需要时恢复它们。所以我的对象会被复制。如果我只想访问数据,这是可以的。但我还想从片段中修改实际模型(在MainActivity
中引用)
为了进行实验,我在片段中将pristine
设置为false
,并记录在MainActivity
中,它确实是false
但是如果serializable是按值传递的,这是怎么发生的?
我读到:
在Java中,所有对象都通过引用传递,只有基本类型(int、float、long…)通过值传递 我真的不知道Serializable是如何工作的,但是如果它转换成byte[],那就不是一个基本类型,这就是它工作的原因 如果您将一个可序列化类写入一个文件并以ASCII格式打开它,您将看到一种递归的toString(),后面可能是以字节形式显示的数据
希望这有帮助。在Java中,所有对象都是通过引用传递的,只有基本类型(int、float、long…)是通过值传递的 我真的不知道Serializable是如何工作的,但是如果它转换成byte[],那就不是一个基本类型,这就是它工作的原因 如果您将一个可序列化类写入一个文件并以ASCII格式打开它,您将看到一种递归的toString(),后面可能是以字节形式显示的数据
希望这有帮助。在Java中,所有对象都是通过引用传递的,只有基本类型(int、float、long…)是通过值传递的 我真的不知道Serializable是如何工作的,但是如果它转换成byte[],那就不是一个基本类型,这就是它工作的原因 如果您将一个可序列化类写入一个文件并以ASCII格式打开它,您将看到一种递归的toString(),后面可能是以字节形式显示的数据
希望这有帮助。在Java中,所有对象都是通过引用传递的,只有基本类型(int、float、long…)是通过值传递的 我真的不知道Serializable是如何工作的,但是如果它转换成byte[],那就不是一个基本类型,这就是它工作的原因 如果您将一个可序列化类写入一个文件并以ASCII格式打开它,您将看到一种递归的toString(),后面可能是以字节形式显示的数据
希望这会有所帮助。序列化会创建对象的深度副本,这意味着如果您序列化然后反序列化包含其他对象的对象,您将获得新的独立对象(具有新引用)、所有对象的副本,而绝对不引用堆上的对象。因此,如果您修改了刚刚反序列化的对象,那么您将只修改这些对象,而不会修改堆上以前的任何引用
如果要协调刚刚反序列化的引用与内存中的对象,则必须对其进行编码。序列化会创建对象的深度副本,这意味着如果序列化然后反序列化包含其他对象的对象,则将获得新的独立对象(具有新引用)、所有对象的副本,绝对不引用堆中仍然存在的对象。因此,如果您修改了刚刚反序列化的对象,那么您将只修改这些对象,而不会修改堆上以前的任何引用
如果要协调刚刚反序列化的引用与内存中的对象,则必须对其进行编码。序列化会创建对象的深度副本,这意味着如果序列化然后反序列化包含其他对象的对象,则将获得新的独立对象(具有新引用)、所有对象的副本,绝对不引用堆中仍然存在的对象。因此,如果您修改了刚刚反序列化的对象,那么您将只修改这些对象,而不会修改堆上以前的任何引用
如果要协调刚刚反序列化的引用与内存中的对象,则必须对其进行编码。序列化会创建对象的深度副本,这意味着如果序列化然后反序列化包含其他对象的对象,则将获得新的独立对象(具有新引用)、所有对象的副本,绝对不引用堆中仍然存在的对象。因此,如果您修改了刚刚反序列化的对象,那么您将只修改这些对象,而不会修改堆上以前的任何引用
如果要协调刚刚反序列化的引用与内存中的对象,则必须对其进行编码。对可序列化的
对象的引用仍然是对象引用,它与传递列表对象或Foo
对象没有区别。令人困惑的是序列化发生的时间和地点
根据以下文件:
此处提供的参数将在片段销毁和创建过程中保留
有两种方法可以实现这一点:
- 使
Bundle
仅存储原始字节,并对每个get
/put
操作进行序列化/反序列化
- 允许
Bundle
保存活动对象,并在需要销毁/重新创建片段时要求它序列化/反序列化所有内容
显然,第一个选项效率很低:get
/put
操作比活动/片段生命周期更改频繁得多。因此,Android只会在LifeC上需要时进行序列化/反序列化
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainActivityModel = (MainActivityModel) getArguments().getSerializable(ARG_DATA_MODEL);
mMainActivityPlaceholderFragmentView = new MainActivityPlaceholderFragmentView(this, mainActivityModel);
mCallbacks.onPlaceholderFragmentCreated(mainActivityModel.current);
}