我试图序列化以匹配在Rust + Serde中您使用 klaxon 执行“外部标记”枚举的方式。
这是我对 Kotlin 的定义:
@TypeFor(field = "type", adapter = QueryTypeAdapter::class)
open class Query(val type: QueryType)
data class StartTravel(val from:Coordinates, val to:Coordinates): Query(QueryType.StartTravel)
class SearchingDriver: Query(QueryType.SearchDriver)
data class Fail(val error:JsonError): Query(QueryType.Fail)
class QueryTypeAdapter: TypeAdapter<Query> {
override fun classFor(type: Any): KClass<out Query> = when(type as QueryType) {
QueryType.StartTravel-> StartTravel::class
QueryType.SearchDriver -> SearchingDriver::class
QueryType.Fail -> Fail::class
}
}
我需要这个反序列化为:
{"StartTravel":{"from":{"lat":0.0,"long":0.0},"to":{"lat":0.0,"long":0.0}}}
但现在是:
{"from" : {"lat" : 0.0, "long" : 0.0}, "to" : {"lat" : 0.0, "long" : 0.0}, "type" : "StartTravel"}
PD:关于 Rust 的定义(带有可运行测试):
#[derive(Debug, Deserialize, Serialize)]
pub struct JsonError {
pub kind: String,
pub message: String,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct Coordinates {
lat: f64,
long: f64,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct StartTravel {
from: Coordinates,
to: Coordinates,
}
#[derive(Debug, Deserialize, Serialize)]
pub enum QueryType {
StartTravel(StartTravel),
SearchingDriver,
Fail(JsonError),
}