首页 > 解决方案 > 序列化对象中包含的每个对象是否也必须序列化?(安卓、Java)

问题描述

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

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

}

我有一个多标签设置,其中每个标签都是一个片段。每个片段都需要访问代表当前登录用户的唯一用户对象,因此我将用户对象传递给每个片段。为了做到这一点,它需要被序列化,它就是这样。这是其中的一个片段:

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 的部分也需要序列化。这是正确的解释吗?如果是这种情况,我觉得这将是一个很长的序列化兔子洞,如果它甚至可以序列化我不控制的类(并且不想改变)。有没有解决的办法?这样做的正确方法是什么?

感谢您的时间。

标签: javaandroidfirebaseserializationfirebase-authentication

解决方案


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

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

理想情况下,要序列化的数据对象应仅包含最基本的原始数据。它们不应该包含更复杂的对象(尤其是那些自己没有实现的对象Serializable)。真的不需要序列化 ​​FirebaseAuth,因为那是一个单例。而对于 FirebaseUser,您应该考虑仅从该对象中提取相关数据。


推荐阅读