Serialization 从第三方库向类型添加Serialize属性
我正在尝试向Rust中的一个结构添加序列化功能。 这是一个日历事件,如下所示: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
#[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
。不,真的。是的,我知道那是什么样子。