添加Serialize属性以从第三方lib

时间:2015-06-12 00:50:33

标签: serialization attributes rust

我正在尝试为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/uuidDateTime来自https://github.com/lifthrasiir/rust-chrono

如果我尝试构建项目,编译器会抱怨encodeUuid找不到DateTime,这是因为它们都没有派生Encodable和{来自Decodeable包装箱的{1}}。

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

2 个答案:

答案 0 :(得分:5)

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

其次,你不能。如果你没有写出有问题的类型,那么你就不能:这是编译器的故意保证。 (另见“连贯性”。)

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

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

  2. 包装不受支持的类型。这意味着执行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())

我从ker给我question的答案中了解了这一点。希望它对你有所帮助。