2

現在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

ビンコードの 16 進文字列に値が展開されているためです。

serde_json と bincode の両方でシリアル化する必要がある多くの構造体があります。 serde_hexJSONシリアライゼーションに必要なことを正確に行います。bincode serde-hex を使用すると、配列が 16 進文字列に変換されますが、これは望ましくありません。

secp256k1 が を使用しd.is_human_readable()ていることに気付きました。

serde_hexのみに適用しserde_jsonて無視するにはどうすればよいbincodeですか?

4

1 に答える 1