【发布时间】:2014-08-17 10:09:23
【问题描述】:
背景:序列化板条箱没有记录,派生 Decodable 不起作用。我还查看了其他类型的现有实现,发现代码难以遵循。
解码过程是如何工作的,我如何为这个结构实现 Decodable?
pub struct Grid<A> {
data: [[A,..GRIDW],..GRIDH]
}
#[deriving(Decodable)] 不起作用的原因是[A,..GRIDW] 没有实现 Decodable,并且当两者都在这个 crate 之外定义时,不可能为一个类型实现一个 trait,这里就是这种情况。所以我能看到的唯一解决方案是手动实现 Decodable for Grid。
这是我所知道的
impl <A: Decodable<D, E>, D: Decoder<E>, E> Decodable<D, E> for Grid<A> {
fn decode(decoder: &mut D) -> Result<Grid<A>, E> {
decoder.read_struct("Grid", 1u, ref |d| Ok(Grid {
data: match d.read_struct_field("data", 0u, ref |d| Decodable::decode(d)) {
Ok(e) => e,
Err(e) => return Err(e)
},
}))
}
}
在Decodable::decode(d) 出现错误
错误:未能找到 trait 的实现 serialize::serialize::Decodable for [[A, .. 20], .. 20]
【问题讨论】:
-
最简单的方法往往是“将定义更改为确实有效的东西,使用
--pretty expanded获取该定义,然后进行调整以适应新形式”。 -
@ChrisMorgan 我只是不知道如何将其调整为新形式。
-
@A.B.您要反序列化的 JSON 字符串是什么?
-
github.com/Valve/heliotrope/blob/… - JSON 反序列化的几个例子
标签: serialization rust