相关疑难解决方法(0)

1406
推荐指数
11
解决办法
67万
查看次数

为什么可序列化的内部类不可序列化?

以下代码:

public class TestInnerClass {

    public static void main(String[] args) throws IOException {
        new TestInnerClass().serializeInnerClass();
    }

    private void serializeInnerClass() throws IOException {
        File file = new File("test");
        InnerClass inner = new InnerClass();
        new ObjectOutputStream(new FileOutputStream(file)).writeObject(inner);
    }

    private class InnerClass implements Serializable {

        private static final long serialVersionUID = 1L;

    }

}
Run Code Online (Sandbox Code Playgroud)

抛出以下异常:

Exception in thread "main" java.io.NotSerializableException: TestInnerClass
Run Code Online (Sandbox Code Playgroud)

我猜内部类有一个TestInnerClass.this字段允许私有访问TestInnerClass的字段和方法.声明内部类静态可以解决它,但是如果InnerClass需要这种访问呢?有没有办法在没有封闭类的情况下序列化非静态内部类,例如通过引用外部类transient

编辑:例如,只有在序列化之前才需要访问外部类.好的,编译器无法知道,但我认为这就是transient关键字存在的原因.

java serialization inner-classes

21
推荐指数
1
解决办法
3万
查看次数

AndroidX:Parcelable 遇到 IOException,仅在 Android 版本 10 设备中写入可序列化对象

我得到了Parcelable encountered IOException writing serializable object它,它java.io.NotSerializableException: androidx.appcompat.widget.Toolbar仅由Android 版本 10 设备中的错误引起。

我已经搜索了很多结果来获得这个问题的解决方案,但我得到的每个解决方案都告诉implement serializable内部类子内部类中定义 ,我已经做到了,但我只在 Android 10 版设备中遇到了这个错误。

如果我将使用transient此关键字来定义视图或对象,则此错误将得到解决,但此错误会伴随另一个视图、适配器和类。

逻辑猫

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.android.ui.fragment.CustomViewFragment)
        at android.os.Parcel.writeSerializable(Parcel.java:1850)
        at android.os.Parcel.writeValue(Parcel.java:1797)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:945)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1584)
        at android.os.Bundle.writeToParcel(Bundle.java:1253)
        at android.os.Parcel.writeBundle(Parcel.java:1014)
        at android.content.Intent.writeToParcel(Intent.java:11155)
        at android.app.IActivityTaskManager$Stub$Proxy.startAppLockService(IActivityTaskManager.java:8468)
        at android.app.Activity.startAppLockService(Activity.java:8950)
        at android.app.Activity.performStart(Activity.java:8022)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3512)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2175)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7860)
        at java.lang.reflect.Method.invoke(Native Method) …
Run Code Online (Sandbox Code Playgroud)

java android android-studio androidx android-10.0

6
推荐指数
0
解决办法
1513
查看次数

在 Kotlin 中使用 @Parcelize 注释时如何忽略字段

我想@Parcelize在 Kotlin 中使用注解时忽略一个字段,这样该字段就不会被打包,因为这个字段没有实现Parcelable接口。

从这个开始,我们得到一个错误,因为它PagedList是不可分割的:

@Parcelize
data class LeaderboardState(
    val progressShown: Boolean = true,
    val pagedList: PagedList<QUser>? = null
) : Parcelable
Run Code Online (Sandbox Code Playgroud)

给出:

Type is not directly supported by 'Parcelize'. Annotate the parameter type with '@RawValue' if you want it to be serialized using 'writeValue()'
Run Code Online (Sandbox Code Playgroud)

标记为@Transient给出与上述相同的错误:

@Parcelize
data class LeaderboardState(
    val progressShown: Boolean = true,

    //Same error
    @Transient
    val pagedList: PagedList<QUser>? = null
) : Parcelable
Run Code Online (Sandbox Code Playgroud)

我发现有一个未记录的注释被调用@IgnoredOnParcel,它给出了相同的错误,注释上有一个 lint 错误:

@Parcelize
data …
Run Code Online (Sandbox Code Playgroud)

android parcelable kotlin

5
推荐指数
1
解决办法
2680
查看次数