我有一个像这样的结构:
struct S {
data: i32,
fun: Box<Fn()>,
}
并希望使用编码器序列化数据部分。为此,我使用rustc_serialize并推导其特征,例如
#[derive(RustcEncodable, RustcDecodable)]
struct S {
data: i32,
fun: Box<Fn()>,
}
问题是它fun
不能被序列化,因为它是一个函数。很好,因为我只想序列化纯data
字段。有没有办法做到这一点?
data
在我的实际用例中,该字段也是一个结构,该结构也可以具有一个结构,Fn
因此我不能简单地将该结构一分为二。
最简洁的答案是不”。rustc序列化的条板箱1不提供对traitDecodable
或的特性的自动实现的控制级别Encodable
。
为此,您需要自己实现它们:
extern crate rustc_serialize;
use rustc_serialize::{Encodable, Encoder};
use rustc_serialize::json;
struct S {
data: i32,
fun: Box<Fn()>,
}
impl Encodable for S {
fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
s.emit_struct("S", 1, |s| {
s.emit_struct_field("data", 0, |s| {
s.emit_i32(self.data)
})
})
}
}
fn main() {
let thing = S { data: 42, fun: Box::new(|| println!("I am a function")) };
let json = json::encode(&thing).expect("Couldn't encode");
println!("{}", json);
(thing.fun)();
}
如果您不依赖于rustc-serialize,则可能对提供和注释的serde感兴趣。#[serde(skip_serializing)]
#[serde(skip_deserializing)]
1:从技术上讲,由编译器#[derive(RustcEncodable, RustcDecodable)]
提供。这就是为什么它有前缀的原因。它也是一个丑陋的疣,希望被删除,但正在等待对编译器插件的稳定支持。Rustc
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句