Serialization 从第三方库向类型添加Serialize属性

Serialization 从第三方库向类型添加Serialize属性,serialization,attributes,rust,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: Da

我正在尝试向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>,
}
#[派生(PartialEq、克隆、可编码、可解码)]
发布结构事件{
发布id:Uuid,
酒吧名称:String,
pub desc:String,
酒吧位置:String,
酒吧开始:日期时间,
酒吧结束:日期时间,
}
该结构使用来自第三方的两种不同类型,即
Uuid
来自和
DateTime
来自

如果我尝试构建该项目,编译器会抱怨没有为
Uuid
DateTime
找到
encode
,这是因为它们都不是从
序列化
板条箱派生的
可编码
可解码

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

首先,您不想使用
可编码的
可解码的
;您要使用板条箱中的
RustcEncodable
RustcDecodable

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

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

  • 手动实现trait。有时,
    派生
    不起作用,因此您必须手动编写trait实现。在这种情况下,您可以直接手动实现不受支持类型的编码/解码

  • 包装不支持的类型。这意味着执行类似于
    struct UuidWrap(pub Uuid)的操作。这会给你一个你写的新类型,这意味着你可以。。。好吧,执行1,但只需少量代码即可。当然,现在你必须包裹和打开UUID,这有点痛苦


  • 我是在为同一问题寻找解决方案时发现这个问题的。Chrono已启用rustc序列化支持。您必须通过添加dependecy来启用它,如下所示

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

    我是从给我父母的答复中得知这一点的。希望对您有所帮助。

    如果他使用
    serde
    ?是否
    serde
    使用了
    Encodable
    /
    Decodable
    ?从回购协议上的文档来看,不,它使用了不同的特征。此外,他们还特别提到了
    序列化
    板条箱。无论如何,如果他们正在使用Serde,他们应该这样说,否则答案就没用了。:)
    serialize
    rustc serialize
    之间有什么区别?@0kp一个是编译器内部的,不应该被任何其他人使用,另一个在crates.io上,可以被其他人使用。出于当时我确信有意义的原因,它们是按顺序排列的
    serialize
    rustc serialize
    。不,真的。是的,我知道那是什么样子。