Добавить атрибут Serialize в тип из сторонней библиотеки
Я пытаюсь добавить функциональность сериализации в одну из моих структур в Rust. Это событие для календаря и выглядит так:
#[derive(PartialEq, Clone, Encodable, Decodable)]
pub struct Event {
pub id: Uuid,
pub name: String,
pub desc: String,
pub location: String,
pub start: DateTime<Local>,
pub end: DateTime<Local>,
}
Структура использует два разных типа от сторонних Uuid
с https://github.com/rust-lang/uuid и DateTime
с https://github.com/lifthrasiir/rust-chrono.
Если я пытаюсь построить проект, компилятор жалуется, что encode
не был найден для Uuid
а также DateTime
, потому что они оба не выводят Encodable
а также Decodeable
, от serialize
обрешетка.
Итак, вопросы: есть ли способ добавить производные к сторонним структурам, не затрагивая код самих библиотек? Если нет, то как лучше добавить функциональность сериализации в такой ситуации?
2 ответа
Прежде всего, вы не хотите использовать Encodable
а также Decodable
; ты хочешь использовать RustcEncodable
а также RustcDecodable
от rustc-serialize
обрешетка.
Во-вторых, вы не можете. Если вы не написали тип или вопрос, о котором идет речь, вы просто не сможете: это преднамеренная гарантия со стороны компилятора. (Смотрите также "согласованность".)
В этой ситуации вы можете сделать две вещи:
Реализуйте черты вручную. Иногда,
derive
не работает, поэтому вы должны написать реализацию черты вручную. В этом случае это даст вам возможность просто вручную реализовать кодирование / декодирование для неподдерживаемых типов напрямую.Оберните неподдерживаемые типы. Это значит делать что-то вроде
struct UuidWrap(pub Uuid);
, Это дает вам новый тип, который вы написали, что означает, что вы можете... ну, делать #1, но делать это для меньшего количества кода. Конечно, теперь вам нужно обернуть и развернуть UUID, что немного болезненно.
Я нашел этот вопрос, когда искал решение для той же проблемы. Chrono включил поддержку rustc-serialize. Вы должны включить его, добавив зависимость следующим образом.
[dependencies.chrone]
version = "*"
features = ["rustc-serialize"]
Я узнал об этом из ответа oli_obk - ker на мой вопрос. Надеюсь, это поможет вам.