serialization - 将氧化钠的公钥序列化为 JSON

标签 serialization rust public-key libsodium

我尝试将氧化钠的 PublicKey 结构(libsodium 的 Rust 绑定(bind))序列化为一个文件(例如 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 = "*"

最佳答案

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/" }

关于serialization - 将氧化钠的公钥序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38250632/

相关文章:

c# - 无法将 XML 反序列化为 C# 对象,我做错了什么?

import - 如何从同级模块导入?

java - 谷歌/叮当 : How use public key to verify signature

C# 如何简单地使用 PGP 公钥加密文本文件?

ssh - 将ssh公钥添加到服务器

java - jackson 序列化 csv 属性顺序

windows - 对于文件夹列表的树表示,平面文件的哪种结构最有效?

scala - Spark : Dataframe Serialization

rust - 循环中的Rust所有权

rust - 在 Rust 中实现通用计算算法的正确方法是什么?