带有子类的可序列化类

问题描述 投票:0回答:1

我正在尝试在我的主要方法中构建一个选择器:

fun main() {
    val gen = TestGenerator()
    val testSet = listOf(
        TestSpec("Test-1", SCENARIO, when (ALGORITHM) {
            AlgorithmType.MAXPLUS -> MaxPlusSpec(MIN_REWARD, MAX_REWARD, MAX_ITER, THRESHOLD, COMPUTATION_TYPE)
            AlgorithmType.MCTS -> MCTSSpec(MIN_REWARD, MAX_REWARD, MAX_ITER, C_VALUE, COMPUTATION_TYPE)
        })
    )
    gen.runLinearTestSet(testSet)
}

因此,当通过集中式或分散式计算选择 maxplus 或 mcts 时,我们希望根据它传递正确的参数。

我尝试这样解决:

@Serializable
data class MaxPlusSpec(
    val minReward: Float,
    val maxReward: Float,
    val maxIterationNumber: Int,
    val convergenceThreshold: Float,
    computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MAXPLUS, computationType)

@Serializable
data class MCTSSpec(
    val minReward: Float,
    val maxReward: Float,
    val maxIterationNumber: Int,
    val cValue: Float,
    computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MCTS, computationType)

这会引发错误:

'computationType'隐藏超类型'AlgorithmSpec'的成员并且需要'override'修饰符

可序列化类在类本身或其超类型中具有重复的属性“computationType”序列名称

所以我尝试像这样实现它:

@Serializable
data class MaxPlusSpec(
    val minReward: Float,
    val maxReward: Float,
    val maxIterationNumber: Int,
    val convergenceThreshold: Float,
    computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MAXPLUS, computationType)

@Serializable
data class MCTSSpec(
    val minReward: Float,
    val maxReward: Float,
    val maxIterationNumber: Int,
    val cValue: Float,
    computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MCTS, computationType)

这当然不起作用,因为我们无法在数据类中没有 var/val 关键字的情况下分配计算类型。

我不知道如何进行这项工作。任何帮助将不胜感激。

编辑:

目前采用此解决方法,这不是最佳方案,但目前确实有效:

    @Serializable
abstract class AlgorithmSpec(
    val algorithmType: AlgorithmType
) {
    abstract val computationType: ComputationType
}

@Serializable
data class MaxPlusSpec(
    val minReward: Float,
    val maxReward: Float,
    val maxIterationNumber: Int,
    val convergenceThreshold: Float,
    override val computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MAXPLUS)

@Serializable
data class MCTSSpec(
    val minReward: Float,
    val maxReward: Float,
    val maxIterationNumber: Int,
    val cValue: Float,
    override val computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MCTS)
algorithm kotlin serialization dataclasses
1个回答
0
投票

解决如下:

@Serializable
sealed class AlgorithmSpec(
    val algorithmType: AlgorithmType
) {
    abstract val computationType: ComputationType
}

@Serializable
data class MaxPlusSpec(
    val minReward: Float,
    val maxReward: Float,
    val maxIterationNumber: Int,
    val convergenceThreshold: Float,
    override val computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MAXPLUS)

@Serializable
data class MCTSSpec(
    val minReward: Float,
    val maxReward: Float,
    val maxIterationNumber: Int,
    val cValue: Float,
    override val computationType: ComputationType
) : AlgorithmSpec(AlgorithmType.MCTS)
© www.soinside.com 2019 - 2024. All rights reserved.