Как сериализовать класс библиотеки в Protobuf с помощью kotlinx.serialization?

Как сериализовать библиотечный класс в Protobuf с помощью kotlinx.serialization? Поскольку он не редактируется, я не могу добавлять @SerialId аннотации к его свойствам, как указано в runtime_usage.md # protobuf. Если я напишу собственный внешний сериализатор, как в custom_serializers.md, он не говорит мне, как указать SerialIds для сериализации Protobuf.

Например, я пытаюсь сериализовать java.math.BigDecimal, сохраняя его unscaledValue как bytes и его scale как sint32. Это легко сделать с помощью исходной библиотеки Java Protobuf, но мне интересно, как это сделать с помощью kotlinx.serialization < / а>.


person Shreck Ye    schedule 27.01.2020    source источник


Ответы (1)


Вы можете использовать контекстную сериализацию для класса, который вы не контролируете. Например, определите свой сериализатор следующим образом (json в моем случае, но вы поняли)

val kxJson = Json {
    serializersModule = SerializersModule {
        contextual(java.math.BigDecimal::class, BigDecimalKSerializer)
    }
}

А затем реализовать свой BigDecimalKSerializer. В классах, где вы используете BigDecimal, вы должны аннотировать поле с помощью @Contextual.

Дополнительные сведения см. здесь.

person expert    schedule 10.02.2021