Kotlin多平台下父子类相似字段对象转换方案咨询
Kotlin Multiplatform下Class1转Class2的替代方案
针对你遇到的Apache BeanUtils在KMP环境不兼容的问题,这里有几个实用的替代方案,避免手动复制所有字段的繁琐:
1. 自定义扩展函数(最推荐,类型安全)
因为Class1和Class2都继承自Parent,你可以写一个专属的扩展函数统一处理字段映射,后续新增字段只需要修改这一处代码,维护成本低。
示例代码:
// 假设业务上Class1的x对应Class2的a,y对应b,根据实际需求调整映射关系 fun Class1.toClass2(): Class2 { return Class2( // 父类字段直接复用 l = this.l, m = this.m, // 子类字段按业务逻辑映射 a = this.x, b = this.y ) } // 使用方式 val class2Instance = class1Instance.toClass2()
这种方式完全基于Kotlin原生语法,全平台兼容,而且编译期就能检查字段是否存在,不会出现反射类库的运行时问题。
2. 借助Kotlinx Serialization序列化转换
如果你的数据类已经使用kotlinx.serialization做序列化(KMP官方推荐的序列化库),可以通过序列化+反序列化实现对象转换,适合字段较多且映射关系简单的场景。
示例代码:
// 先给父类和子类添加序列化注解 @Serializable open class Parent(val l: String, val m: Int) @Serializable class Class1(l: String, m: Int, val x: String, val y: Int) : Parent(l, m) @Serializable class Class2(l: String, m: Int, val a: String, val b: Int) : Parent(l, m) // 转换逻辑 val jsonSerializer = Json { ignoreUnknownKeys = true // 忽略双方不存在的字段(如果有) coerceInputValues = true // 处理字段类型不匹配的情况(可选) } val class2Instance = jsonSerializer.decodeFromString<Class2>( jsonSerializer.encodeToString(class1Instance) )
如果字段名不直接对应,可以用@SerialName注解指定映射,比如给Class1的x字段加@SerialName("a"),这样序列化时会把x序列化为a,反序列化到Class2的a字段。
3. 不推荐:反射类方案
虽然有些反射库声称支持KMP,但反射在KMP的不同平台(比如JS、Native)存在兼容性限制,运行时可能出现异常,而且性能不如前两种方案,除非特殊情况不建议使用。
内容的提问来源于stack exchange,提问作者Prakash Reddy
相关产品推荐
相关产品推荐

