【问题标题】:Make serde only produce hex strings for human-readable serialiser?让 serde 只为人类可读的序列化程序生成十六进制字符串?
【发布时间】:2021-04-18 06:13:26
【问题描述】:

我目前正在使用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 uses d.is_human_readable()

如何使serde_hex 仅适用于serde_json 而被bincode 忽略?

【问题讨论】:

    标签: rust serde serde-json bincode


    【解决方案1】:

    可用于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 转换为泛型来改进 sn-p。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多