我正在尝试解决序列化和反序列化
起初,我尝试使用Serde,因为它是Rust序列化机制的事实标准。 Serde能够序列化
主要问题是反序列化。要反序列化多态类型,您需要在序列化数据中有某些类型标记。首先应该反序列化此标记,然后使用它来动态获取将返回
Box<SomeTrait>
的问题。我知道在封闭类型层次结构的情况下,推荐的方法是使用枚举,并且它们的序列化没有问题,但在我的情况下,使用枚举是不合适的解决方案。起初,我尝试使用Serde,因为它是Rust序列化机制的事实标准。 Serde能够序列化
Box<X>
,但在X
是特质的情况下无法序列化。Serialize
特质不能为特质对象实现,因为它具有通用方法。可以通过使用erased-serde来解决此特定问题,以便可以对Box<SomeTrait>
进行序列化。主要问题是反序列化。要反序列化多态类型,您需要在序列化数据中有某些类型标记。首先应该反序列化此标记,然后使用它来动态获取将返回
Box<SomeTrait>
的函数。
std::any::TypeId
可以用作标记类型,但主要问题是如何动态获取反序列化函数。我不考虑为每个多态类型注册一个函数的选项,因为需要在应用程序初始化期间手动调用。
我知道两种可能的方法:
- 像C#这样具有运行时反射功能的语言可以使用它来获取反序列化方法。
- 在C++中,cereal库使用静态对象的技巧,在库初始化时将反序列化器注册到静态映射中。
但是,Rust中没有这些选项。如果有的话,如何添加多态对象反序列化呢?
erased_serde
中的类型擦除发生在Deserializer
上,而不是正在被反序列化的对象上。 - E net4enum_dispatch
感兴趣,它可以从另一个方向解决您的程序问题。它提供了一个派生宏,可以自动生成样板代码match
表达式,自动实现枚举类型的 traits。 - Qwertycrackers