【发布时间】:2015-09-25 21:44:57
【问题描述】:
所以我尝试在这些instructions 之后使用 bincode 序列化一个结构,并且我能够让它工作。
但后来我想用IpAddr 枚举序列化一个结构。由于 IpAddr 没有实现所需的 Encodable 特征,我从 git 下载了 rustc_serialize crate 并为 IpAddr 自己实现了可编码。然后我将我的Cargo.toml 文件更改为:
[dependencies]
# rustc-serialize = "0.3"
byteorder = "0.3"
bincode = "0.4"
[dependencies.rustc-serialize]
path = "src/rustc-serialize-master"
但是现在,我使用的结构中的相同代码无法编译
即使我在结构上方有#[derive(RustcEncodable)],也没有为我的结构实现rustc_serialize::serialize::Encodable。
即使我删除了添加到本地版本 rustc_serialize 的代码,我仍然会收到该错误。
我认为这可能是由于 bincode 和本地 rustc_serialize 交互的方式搞砸了,但我不确定。
【问题讨论】:
-
对于它的价值,fork
rustc-serialize为另一种类型添加编码可能是个坏主意。为包含IpAddr的结构手动实现Encodable特征可能更明智。 -
我试过了,但我得到了一个“只有在当前 crate 中定义的特征才能实现任意类型”的错误。您似乎无法为您未定义的结构(导入的 IpAddr)实现未定义的特征(导入的 rustc-serialize 'encodable` 特征)。如果你能做到这一点,请告诉我。谢谢!
-
查看How do I implement a trait I don't own for a type I don't own?。包装器类型是正确的解决方案。在您的情况下,您已经有一个包装器类型(serialize a struct with an IpAddr enum)。无论您的结构是什么,您都可以手动实现
Encodable。 -
感谢您的快速回复。所以我一直在尝试实现这一点,但我遇到了一个错误。因此,根据您链接的堆栈溢出,我有
impl Encodable for myStruct { fn encode ..... { match *self { IpAddr(_) => {}, _ => {}, } } }但即使我已使用 use 明确导入它,我仍然收到Unresolved enum variant, struct or const 'IpAddr'错误,并且我在内置类型上也遇到相同的错误。 (P.S. 你怎么能在 cmets 中做代码块?)谢谢! -
这只是在这种情况下不需要的一些语法(我也对另一个问题添加了评论)。你想要更接近to this 的东西。另外,你不能在 cmets 中做代码块,因为 cmets 应该很短,可能会被删除。
标签: rust