如何解决让 serde 只为人类可读的序列化程序生成十六进制字符串?
我目前正在使用 serde-hex。
use serde_hex::{SerHex,StrictPfx,CompactPfx};
#[derive(Debug,PartialEq,Eq,Serialize,Deserialize)]
struct Foo {
#[serde(with = "SerHex::<StrictPfx>")]
bar: [u8;4],#[serde(with = "SerHex::<CompactPfx>")]
bin: u64
}
fn it_works() {
let foo = Foo { bar: [0,1,2,3],bin: 16 };
let ser = serde_json::to_string(&foo).unwrap();
let exp = r#"{"bar":"0x00010203","bin":"0x10"}"#;
assert_eq!(ser,exp);
// this fails
let binser = bincode::serialize(&foo).unwrap();
let binexp: [u8; 12] = [0,3,16,0];
assert_eq!(binser,binexp);
}
失败:
thread 'wire::era::tests::it_works' panicked at 'assertion Failed: `(left == right)`
left: `[10,48,120,49,50,51,4,48]`,right: `[0,0]`',src/test.rs:20:9
因为它已将值扩展为二进制代码的十六进制字符串。
我有很多结构体,我需要用 serde_json 和 bincode 序列化它们。 serde_hex
正是我需要的 JSON 序列化。使用 bincode 时 serde-hex 仍然将数组转换为十六进制字符串,这是不想要的。
我注意到 secp256k1 uses d.is_human_readable()
。
如何使 serde_hex
仅适用于 serde_json
并被 bincode
忽略?
解决方法
可用于 serde's with-attribute 的函数的实现主要是样板文件,看起来像这样。 这仅区分人类可读和其他格式。如果您需要更细粒度的控制,您可以改为在线程局部变量上进行分支。
fn serialize_hex<S>(v: &u64,serializer: S) -> Result<S::Ok,S::Error>
where
S: serde::Serializer,{
if serializer.is_human_readable() {
serde_hex::SerHex::<serde_hex::StrictPfx>::serialize(v,serializer)
} else {
v.serialize(serializer)
}
}
// use like
// #[serde(serialize_with = "serialize_hex")]
// bin: u64
可以通过将 u64
转换为泛型来改进代码段。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。