我正在尝试解决序列化和反序列化的问题Box<SomeTrait>
.我知道在封闭类型层次结构的情况下,推荐的方法是使用枚举,并且序列化没有问题,但在我的情况下使用枚举是不合适的解决方案.
起初我尝试使用Serde,因为它是事实上的Rust序列化机制.Serde能够序列化Box<X>
但不能在何时X
成为特征.该Serialize
特性不能为特征的对象实现的,因为它具有通用的方法.这个特殊问题可以通过使用擦除serde来解决,因此序列化Box<SomeTrait>
可以工作.
主要问题是反序列化.要反序列化多态类型,您需要在序列化数据中使用某种类型标记.该标记应首先反序列化,然后用于动态获取将返回的函数Box<SomeTrait>
.
std::any::TypeId
可以用作标记类型,但主要问题是如何动态获取反序列化函数.我不考虑为应用程序初始化期间应手动调用的每种多态类型注册函数的选项.
我知道有两种可能的方法:
但Rust中没有这些选项.如果有的话,如何在Rust中添加多态对象的反序列化?