添加 Serialize 属性以从第三方库键入

Add Serialize attribute to type from third-party lib

我正在尝试将序列化功能添加到我的 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 and the DateTime from https://github.com/lifthrasiir/rust-chrono

如果我尝试构建项目,编译器会抱怨找不到 UuidDateTimeencode,这是因为它们都没有派生 EncodableDecodeable,来自 serialize 板条箱。

所以问题是: 有没有办法在不触及库本身代码的情况下将派生添加到第三方结构?如果不是,在这种情况下添加序列化功能的最佳方法是什么?

首先,你不想用EncodableDecodable;您想使用 rustc-serialize 箱子中的 RustcEncodableRustcDecodable

其次,你不能。如果你没有写出有问题的类型有问题的特征,你就是不能:这是故意保证编译器。 (另见 "coherence"。)

在这种情况下,您可以做两件事:

  1. 手动实现特征。有时,derive不起作用,所以你必须手动编写特征实现。在这种情况下,它会让您有机会直接为不受支持的类型手动实现 encoding/decoding。

  2. 包装不受支持的类型。 这意味着做类似 struct UuidWrap(pub Uuid); 的事情。这为您提供了 you 编写的新类型,这意味着您可以...好吧,做#1,但只需要少量代码。当然,现在你必须对UUID进行包装和解包,这是一个的痛苦。

我在寻找相同问题的解决方案时发现了这个问题。 Chrono 启用了 rustc-serialize 支持。您必须通过如下添加依赖项来启用它。

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

我是从ker to my 的回答中了解到的。希望对你有所帮助。