Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.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
Java Android何时序列化对象?_Java_Android_Android Fragments_Serialization_Pass By Reference - Fatal编程技术网

Java 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

我正在从事一个Android项目,我想将一个自定义类
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);
    }