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