首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使Pro卫士为对象保留kotlinx序列化程序?

如何使Pro卫士为对象保留kotlinx序列化程序?
EN

Stack Overflow用户
提问于 2022-01-11 07:33:32
回答 1查看 1.7K关注 0票数 1

我有一个kotlin类和一个对象

代码语言:javascript
运行
复制
@Serializable
@SerialName("Cl")
class Cl(...)

@Serializable
@SerialName("Obj")
object Obj

我的护卫是这样配置的

代码语言:javascript
运行
复制
-keepclassmembers class kotlinx.serialization.json.** {
    *** Companion;
}
-keepclasseswithmembers class kotlinx.serialization.json.** {
    kotlinx.serialization.KSerializer serializer(...);
}
-keepclasseswithmembers class .** {
    kotlinx.serialization.KSerializer serializer(...);
}

-keep,includedescriptorclasses class my.package.**$$serializer { *; }

但是,虽然保持类的序列化程序,但对象的序列化程序却不是。下面是类的映射:

代码语言:javascript
运行
复制
Cl -> Cl:
...
    ...
    67:67:void <init>(... ,kotlinx.serialization.internal.SerializationConstructorMarker) -> <init>
    70:75:void <init>(...) -> <init>
    67:67:void write$Self(Cl,kotlinx.serialization.encoding.CompositeEncoder,kotlinx.serialization.descriptors.SerialDescriptor) -> e
Cl$$serializer -> Cl$$serializer:
...
    67:75:void <clinit>() -> <clinit>
    67:67:void <init>() -> <init>
    67:67:kotlinx.serialization.KSerializer[] childSerializers() -> childSerializers
    67:67:Cl deserialize(kotlinx.serialization.encoding.Decoder) -> deserialize
    67:67:java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder) -> deserialize
    67:67:void serialize(kotlinx.serialization.encoding.Encoder,Cl) -> serialize
    67:67:void serialize(kotlinx.serialization.encoding.Encoder,java.lang.Object) -> serialize
    67:67:kotlinx.serialization.KSerializer[] typeParametersSerializers() -> typeParametersSerializers
Cl$Companion -> Cl$Companion:
...
    67:67:void <init>() -> <init>
    67:67:kotlinx.serialization.KSerializer serializer() -> serializer

下面是对象的映射:

代码语言:javascript
运行
复制
Obj -> Obj:
...
    Obj INSTANCE -> n
    kotlin.Lazy $cachedSerializer$delegate -> o
    ...
    47:47:kotlin.Lazy get$cachedSerializer$delegate() -> e
    47:47:kotlinx.serialization.KSerializer serializer() -> serializer
Obj$$cachedSerializer$delegate$1 -> Obj$a:
...
    Obj$$cachedSerializer$delegate$1 INSTANCE -> l
    47:47:kotlinx.serialization.KSerializer invoke() -> a
    47:47:java.lang.Object invoke() -> m
...

这种混淆会导致崩溃(仅当混淆时,仅针对对象):

代码语言:javascript
运行
复制
polymorphic(...) {
  subclass(Obj::class)
}

Serializer for class 'Obj' is not found. Mark the class as @Serializable or provide the serializer explicitly.

我如何告诉Proguard保留object的序列化程序?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-15 22:12:31

有可用的文档如何配置ProGuard,它似乎与您正在使用的配置不匹配。

用它,你就可以走了。

纯粹的信息,因为上面已经回答了您的问题:序列化程序在运行时查找object是不同的,并且是通过INSTANCE进行的。文档中的相关部分。

代码语言:javascript
运行
复制
# Keep `INSTANCE.serializer()` of serializable objects.
-if @kotlinx.serialization.Serializable class ** {
    public static ** INSTANCE;
}
-keepclassmembers class <1> {
    public static <1> INSTANCE;
    kotlinx.serialization.KSerializer serializer(...);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70663076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档