繁体   English   中英

序列化的 object 中包含的每个 object 是否也必须序列化? (安卓、爪哇)

[英]Does every object contained within a serialized object have to be serialized as well? (Android, Java)

我正在使用 Android Studio (Java),并将 Google Firebase 合并到我的项目中。 在我的主要活动中,我实例化了一个 firebase 用户,并将所有相关信息存储在自定义“用户”class 中。

public class User implements Serializable{
    FirebaseUser user;
    FirebaseAuth mAuth;
    String uid;

    public User()
    {
        System.out.println("Creating User");
        mAuth = FirebaseAuth.getInstance(); 
        user = mAuth.getCurrentUser();
        uid = user.getUid();
    }

}

我有一个多选项卡设置,其中每个选项卡都是一个片段。 每个片段都需要访问代表当前登录用户的单独用户 object,因此我将用户 object 传递给每个片段。 为了做到这一点,它需要被序列化,它是。 这是其中一个片段:

public class tab_list extends Fragment {

     private static final String ARG_PARAM1 = "user_List";
     private User user;

    public tab_list() {
        // Required empty public constructor
    }

    public static tab_list newInstance(User u) {
        tab_list fragment = new tab_list(); // This calls the empty constructor above
        Bundle args = new Bundle();
        args.putSerializable(ARG_PARAM1, u);
        fragment.setArguments(args);
        return fragment;
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            user = (User) getArguments().getSerializable(ARG_PARAM1);
        }
    }
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState){
       //Do Stuff
    }
}

一切都很好,选项卡可以访问存储在用户中的数据,我也可以做我需要的一切。 直到应用程序结束在后台,如果我的手机通过切换应用程序或拉下托盘或让屏幕休眠将应用程序置于后台:应用程序崩溃并且我收到此错误:

“Parcelable 遇到 IOException 写入可序列化对象”。 . . 引起:java.io.NotSerializableException:com.google.firebase.auth.internal.zzn

对我来说,这意味着 firebase auth 的部分也需要序列化。 这是正确的解释吗? 如果是这样的话,我觉得这将是一个很长的序列化兔子洞,如果它甚至有可能序列化我不控制(并且不想改变)的类。 有没有解决的办法? 这样做的正确方法是什么?

感谢您的时间。

对我来说,这意味着 firebase auth 的部分也需要序列化。 这是正确的解释吗?

是的,如果您想使用 Java 的内置序列化来序列化某些东西,它会尝试序列化所有嵌套对象。 正如您所发现的那样,使用 Firebase 个对象并不是那么容易。 它们根本不应该以这种方式序列化。

要序列化的数据对象最好只包含最基本的原始数据。 它们不应包含更复杂的对象(尤其是那些本身未实现Serializable的对象)。 确实没有必要序列化 FirebaseAuth,因为它是一个 singleton。对于 FirebaseUser,您应该考虑仅从该 object 中提取相关数据。

默认序列化机制不序列化声明为transient的字段。

语言规范,8.3.1.3

可序列化接口

因此,我想您可以使 FirebaseUser 和 FirebaseAuth 成员成为临时成员,同时“手动”提取您需要的任何部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM