Добавить атрибут 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 обрешетка.

Во-вторых, вы не можете. Если вы не написали тип или вопрос, о котором идет речь, вы просто не сможете: это преднамеренная гарантия со стороны компилятора. (Смотрите также "согласованность".)

В этой ситуации вы можете сделать две вещи:

  1. Реализуйте черты вручную. Иногда, derive не работает, поэтому вы должны написать реализацию черты вручную. В этом случае это даст вам возможность просто вручную реализовать кодирование / декодирование для неподдерживаемых типов напрямую.

  2. Оберните неподдерживаемые типы. Это значит делать что-то вроде struct UuidWrap(pub Uuid);, Это дает вам новый тип, который вы написали, что означает, что вы можете... ну, делать #1, но делать это для меньшего количества кода. Конечно, теперь вам нужно обернуть и развернуть UUID, что немного болезненно.

Я нашел этот вопрос, когда искал решение для той же проблемы. Chrono включил поддержку rustc-serialize. Вы должны включить его, добавив зависимость следующим образом.

[dependencies.chrone]
version = "*"
features = ["rustc-serialize"]

Я узнал об этом из ответа oli_obk - ker на мой вопрос. Надеюсь, это поможет вам.

Другие вопросы по тегам