serialization - sobrecarga - tipos de polimorfismo y ejemplos
¿Cómo se puede agregar la deserialización de objetos de rasgos polimórficos en Rust, si es que se puede? (1)
Estoy tratando de resolver el problema de la serialización y deserialización de Box<SomeTrait>
. Sé que en el caso de una jerarquía de tipos cerrados, la forma recomendada es usar una enumeración y no hay problemas con su serialización, pero en mi caso, usar enums es una solución inapropiada.
Al principio traté de usar Serde ya que es el mecanismo de serialización de óxido de facto. Serde es capaz de serializar Box<X>
pero no en el caso cuando X
es un rasgo. El rasgo Serialize
no se puede implementar para objetos de rasgo porque tiene métodos genéricos. Este problema en particular se puede resolver mediante el uso de seriado borrado para que la serialización de Box<SomeTrait>
pueda funcionar.
El principal problema es la deserialización. Para deserializar el tipo polimórfico necesita tener algún tipo de marcador en datos serializados. Este marcador debe deserializarse primero y luego usarlo para obtener dinámicamente la función que devolverá Box<SomeTrait>
.
std::any::TypeId
podría usarse como un tipo de marcador, pero el problema principal es cómo obtener dinámicamente la función de deserialización. No considero la opción de registrar una función para cada tipo polimórfico que debería llamarse manualmente durante la inicialización de la aplicación.
Conozco dos maneras posibles de hacerlo:
- Los lenguajes que tienen reflejos de tiempo de ejecución como C # pueden usarlo para obtener el método de deserialización.
- En C ++, la biblioteca de cereales utiliza la magia de los objetos estáticos para registrar el deserializador en un mapa estático en el momento de inicialización de la biblioteca.
Pero ninguna de estas opciones está disponible en Rust. ¿Cómo se puede agregar la deserialización de objetos polimórficos en Rust, si es que se puede?
Todas sus bibliotecas podrían proporcionar una rutina de registro, protegida por std::sync::Once
, que registra algún identificador en un static mut
común static mut
, pero obviamente su programa debe llamarlos a todos.
No tengo idea si TypeId
arroja valores consistentes en recompilaciones con diferentes dependencias.