簡體   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