【问题标题】:Serialize sodiumoxides' PublicKey into JSON将氧化钠的公钥序列化为 JSON
【发布时间】:2016-11-10 01:50:31
【问题描述】:

我尝试将氧化钠的 PublicKey 结构(libsodium 的 Rust 绑定)序列化为文件(例如 JSON,但二进制也可以)。

这是我的代码:

extern crate serde;
extern crate serde_json;
extern crate sodiumoxide;

use serde::Serialize;
use serde_json::ser::Serializer;
use sodiumoxide::crypto::sign;

fn main() {
    let (pk, _) = sign::gen_keypair();    
    let pk_ser = serde_json::to_string(&pk);
}

我收到以下错误消息:

error: the trait bound `sodiumoxide::crypto::sign::PublicKey: serde::Serialize` is not satisfied [E0277]

所以编译器告诉我PublicKey 应该实现 serde::Serialize 特征。但它确实实现了serde::Serialize,如下所述:https://dnaq.github.io/sodiumoxide/sodiumoxide/crypto/sign/ed25519/struct.PublicKey.html

那么,问题出在哪里?

编辑:

Cargo.toml:

[package]
name = ...
version = ...
authors = ...

[dependencies]
serde       = "*"
serde_json  = "*"
sodiumoxide = "*"

【问题讨论】:

    标签: serialization rust public-key libsodium


    【解决方案1】:

    crates.io 上最新可用的sodiumoxide 版本目前是0.0.10,它不支持serde。如果您查看Cargo.toml file for the 0.0.10 tag,您可以看到这一点。

    你现在可以做的是使用来自 github 而不是 crates.io 的依赖项,直到他们推出新版本。像这样编辑您的 Cargo.toml 文件:

    [dependencies]
    serde       = "*"
    serde_json  = "*"
    sodiumoxide = { git = "https://github.com/dnaq/sodiumoxide" }
    

    由于您使用的是来自 github 的 sodiumoxide 版本,因此您还需要使用其 FFI 包装器 libsodium-sys 的 github 版本。您可以通过将其添加到您的 Cargo.toml 来做到这一点:

    [replace]
    "libsodium-sys:0.0.10" = { git = "https://github.com/dnaq/sodiumoxide/" }
    

    【讨论】:

    • 确实需要知道这一点。我假设大多数初学者只使用 crates.io。你有兴趣在 GitHub 上写一个问题吗?如果没有,我会这样做:-)
    • 我会让你这样做:)
    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2020-11-26
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2012-02-25
    相关资源
    最近更新 更多