添加 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。
如果我尝试构建项目,编译器会抱怨找不到 Uuid
和 DateTime
的 encode
,这是因为它们都没有派生 Encodable
和 Decodeable
,来自 serialize
板条箱。
所以问题是:
有没有办法在不触及库本身代码的情况下将派生添加到第三方结构?如果不是,在这种情况下添加序列化功能的最佳方法是什么?
首先,你不想用Encodable
和Decodable
;您想使用 rustc-serialize
箱子中的 RustcEncodable
和 RustcDecodable
。
其次,你不能。如果你没有写出有问题的类型或有问题的特征,你就是不能:这是故意保证编译器。 (另见 "coherence"。)
在这种情况下,您可以做两件事:
手动实现特征。有时,derive
不起作用,所以你必须手动编写特征实现。在这种情况下,它会让您有机会直接为不受支持的类型手动实现 encoding/decoding。
包装不受支持的类型。 这意味着做类似 struct UuidWrap(pub Uuid);
的事情。这为您提供了 you 编写的新类型,这意味着您可以...好吧,做#1,但只需要少量代码。当然,现在你必须对UUID进行包装和解包,这是一个位的痛苦。
我在寻找相同问题的解决方案时发现了这个问题。 Chrono 启用了 rustc-serialize 支持。您必须通过如下添加依赖项来启用它。
[dependencies.chrone]
version = "*"
features = ["rustc-serialize"]
我是从ker to my 的回答中了解到的。希望对你有所帮助。
我正在尝试将序列化功能添加到我的 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。
如果我尝试构建项目,编译器会抱怨找不到 Uuid
和 DateTime
的 encode
,这是因为它们都没有派生 Encodable
和 Decodeable
,来自 serialize
板条箱。
所以问题是: 有没有办法在不触及库本身代码的情况下将派生添加到第三方结构?如果不是,在这种情况下添加序列化功能的最佳方法是什么?
首先,你不想用Encodable
和Decodable
;您想使用 rustc-serialize
箱子中的 RustcEncodable
和 RustcDecodable
。
其次,你不能。如果你没有写出有问题的类型或有问题的特征,你就是不能:这是故意保证编译器。 (另见 "coherence"。)
在这种情况下,您可以做两件事:
手动实现特征。有时,
derive
不起作用,所以你必须手动编写特征实现。在这种情况下,它会让您有机会直接为不受支持的类型手动实现 encoding/decoding。包装不受支持的类型。 这意味着做类似
struct UuidWrap(pub Uuid);
的事情。这为您提供了 you 编写的新类型,这意味着您可以...好吧,做#1,但只需要少量代码。当然,现在你必须对UUID进行包装和解包,这是一个位的痛苦。
我在寻找相同问题的解决方案时发现了这个问题。 Chrono 启用了 rustc-serialize 支持。您必须通过如下添加依赖项来启用它。
[dependencies.chrone]
version = "*"
features = ["rustc-serialize"]
我是从ker to my