我正在尝试为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
包装箱的{1}}。
所以问题是: 有没有办法在不触及libs本身的代码的情况下将派生添加到第三方结构?如果没有,在这种情况下添加序列化功能的最佳方法是什么?
答案 0 :(得分:5)
首先,您不想使用Encodable
和Decodable
;您想使用rustc-serialize
包装箱中的RustcEncodable
和RustcDecodable
。
其次,你不能。如果你没有写出有问题的类型或,那么你就不能:这是编译器的故意保证。 (另见“连贯性”。)
在这种情况下你可以做两件事:
手动实现特征。有时,derive
不起作用,因此您必须手动编写特征实现。在这种情况下,它会让您有机会直接手动为不支持的类型实现编码/解码。
包装不受支持的类型。这意味着执行struct UuidWrap(pub Uuid);
之类的操作。这为你提供了一个你写的新类型,这意味着你可以......好吧,做#1,但是为少量的代码做。当然,现在你必须包装和解开UUID,这是痛苦的位。
答案 1 :(得分:1)
当我在寻找相同问题的解决方案时,我发现了这个问题。 Chrono启用了rustc-serialize支持。您必须通过添加依赖性来启用它,如下所示。
data7 <- data.frame(
Date = c("7/6","21/6","31/6","14/7","28/7","11/8","25/8","8/9"),
variable = sample(c("Age 39-40", "Age 62-63"), 8, replace = TRUE),
value = sample(1:8)
)
data8 <- data.frame(
Date = c("7/6","21/6","5/7","19/7","2/8","16/8","25/8","8/9"),
variable = sample(c("Age 39-40", "Age 62-63"), 8, replace = TRUE),
value = sample(1:8)
)
p1<-ggplot(data7,
aes(x=Date, y=value, group=variable)) +
geom_point(size=2, shape = 15) +
geom_line(linetype=1) +
geom_line(data=data8, aes(x=Date, y=value, group=variable),linetype=2) +
geom_point(data=data8, size=2, shape = 1)
p1 + facet_wrap( ~ variable, nrow = 5, ncol = 1, scales= "fixed") +
labs(x="Dates", y="Catches per 20 traps", title="") +
theme(panel.grid.minor.y = element_blank(),
panel.grid.major.y = element_blank())