0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

getSerializable(), getParcelable() が Deprecated になっているのを対処したい

Last updated at Posted at 2025-11-24

概要

Activity や Fragment で getSerializable(), getParcelable() で取得している処理から Deprecated の警告ができているケースがあるので、その対処方法についてメモしました。

対処方法

IntentCompat, BundleCompat を使用する形に書き換えるだけです。

Intentの場合(Activity でよくあるパターン)

intent.getSerializableExtra("my_key") as MyClass?
intent.getParcelableExtra<MyClass?>("my_key")

↓↓ 以下のような形に書き換える

IntentCompat.getSerializableExtra(intent, "my_key", MyClass::class.java)
IntentCompat.getParcelableExtra(intent, "my_key", MyClass::class.java)

Bundle場合(Fragment でよくあるパターン)

requireArguments().getSerializable("my_key") as MyClass?
requireArguments().getParcelable("my_key") as MyClass?

↓↓ 以下のような形に書き換える

BundleCompat.getSerializable(requireArguments(), "my_key", MyClass::class.java)
BundleCompat.getParcelable(requireArguments(), "my_key", MyClass::class.java)

これらのメソッドは何をしているのか?

こちらが IntentCompat.getSerializableExtra() の実装内容で、単にバージョンで分岐しているだけです。

public static <T extends Serializable> @Nullable T getSerializableExtra(@NonNull Intent in, @Nullable String key, @NonNull Class<T> clazz) {
    if (Build.VERSION.SDK_INT >= 34) {
        // Don't call this API on SDK 33 due to b/232589966.
        return Api33Impl.getSerializableExtra(in, key, clazz);
    } else {
        Serializable serializable = in.getSerializableExtra(key);
        return clazz.isInstance(serializable) ? (T) serializable : null;
    }
}

なぜこんな面倒なことが必要?

API Level 33 から新しい getSerializable などの実装加わり、旧メソッドが Deprecated になった状態で リリースされましたが、リリース後に内部実装から NullPointerException が発生することがあるという以下の致命的な問題が発覚しました。

最終的に修正はされましたが、Android のバージョン更新が必要になるため、こうした Compat 系の実装が用意されたようです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?