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