rust - 让 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, 1, 2, 3, 16, 0, 0, 0, 0, 0, 0, 0];
assert_eq!(binser,binexp);
}
失败:
thread 'wire::era::tests::it_works' panicked at 'assertion failed: `(left == right)`
left: `[10, 0, 0, 0, 0, 0, 0, 0, 48, 120, 48, 48, 48, 49, 48, 50, 48, 51, 4, 0, 0, 0, 0, 0, 0, 0, 48, 120, 49, 48]`,
right: `[0, 1, 2, 3, 16, 0, 0, 0, 0, 0, 0, 0]`', src/test.rs:20:9
因为它已将值扩展为二进制码的十六进制字符串。
我有许多需要用 serde_json 和 bincode 序列化的结构。 serde_hex
正是我需要的 JSON 序列化。当使用 bincode serde-hex 时,仍然将数组转换为十六进制字符串,这是不想要的。
我注意到secp256k1 使用d.is_human_readable()
.
我怎样才能使serde_hex
仅适用于serde_json
并被忽略bincode
?
解决方案
可与serde 的 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
转换为通用来改进该片段。
推荐阅读
- c++ - 静态类常量与常量命名空间
- javascript - 如何从linkedin中的Access Token API获取AccessToken
- xml - 使用 XSLT 的 A4 页面边框
- excel - Windows 10 环境中 VBA 打印到 pdf 错误代码的问题
- python - 如何为参数列表中的每个项目运行 pytest 测试
- android - 我正在尝试为 Android TV 上传我的应用,但 Google 团队拒绝了我
- php - 无法使用带有 CakePHP2 的 GD 调整图像大小并将其上传到数据库
- python - 如何使用 xlsxwriter 设置 x 轴数据绘制熊猫数据框
- c# - ASP.NET Core:1 个请求中的 SignOutAsync() 和 SignInAsync() 不可能?
- javascript - 如何在条形图内添加自定义文本以及如何减小图表 js 中 y 轴的步长(条形图)