以下代码:
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关键字存在的原因.
我得到了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) 我想@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)