如何使用 kotlinx.serialization 将库类序列化为 Protobuf?

Posted

技术标签:

【中文标题】如何使用 kotlinx.serialization 将库类序列化为 Protobuf?【英文标题】:How to serialize a library class to Protobuf with kotlinx.serialization? 【发布时间】:2020-05-12 17:18:24 【问题描述】:

如何使用kotlinx.serialization 将库类序列化为 Protobuf?由于它不可编辑,我无法按照runtime_usage.md#protobuf 中的说明将@SerialId 注释添加到其属性中。如果我像 custom_serializers.md 那样编写自己的外部序列化程序,它不会告诉我如何为 Protobuf 序列化指定 SerialIds。

例如,我正在尝试序列化java.math.BigDecimal,将其unscaledValue 存储为bytes,将其scale 存储为sint32。使用原始的 Protobuf Java 库很容易做到这一点,但我想知道如何使用 kotlinx.serialization 做到这一点。

【问题讨论】:

【参考方案1】:

您可以对您无法控制的类使用上下文序列化。例如,像这样定义您的序列化程序(在我的情况下为 json,但您明白了)

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

然后实现你的BigDecimalKSerializer。在使用BigDecimal 的类中,您应该使用@Contextual 注释字段。

更多详情请联系here。

【讨论】:

以上是关于如何使用 kotlinx.serialization 将库类序列化为 Protobuf?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?