小编Dmi*_*don的帖子

如果有的话,如何在Rust中添加多态特征对象的反序列化?

我正在尝试解决序列化和反序列化的问题Box<SomeTrait>.我知道在封闭类型层次结构的情况下,推荐的方法是使用枚举,并且序列化没有问题,但在我的情况下使用枚举是不合适的解决方案.

起初我尝试使用Serde,因为它是事实上的Rust序列化机制.Serde能够序列化Box<X>但不能在何时X成为特征.该Serialize特性不能为特征的对象实现的,因为它具有通用的方法.这个特殊问题可以通过使用擦除serde来解决,因此序列化Box<SomeTrait>可以工作.

主要问题是反序列化.要反序列化多态类型,您需要在序列化数据中使用某种类型标记.该标记应首先反序列化,然后用于动态获取将返回的函数Box<SomeTrait>.

std::any::TypeId可以用作标记类型,但主要问题是如何动态获取反序列化函数.我不考虑为应用程序初始化期间应手动调用的每种多态类型注册函数的选项.

我知道有两种可能的方法:

  1. 具有C#等运行时反射的语言可以使用它来获取反序列化方法.
  2. 在C++中,谷歌库使用静态对象的魔法在库初始化时在静态映射中注册反序列化器.

但Rust中没有这些选项.如果有的话,如何在Rust中添加多态对象的反序列化?

serialization rust serde

15
推荐指数
1
解决办法
1039
查看次数

标签 统计

rust ×1

serde ×1

serialization ×1