Сериализация PublicKey оксидов натрия в JSON

Я пытаюсь сериализовать PublicKey структура оксида натрия (связывание ржавчины для libsodium) с файлом (например, 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 = "*"

1 ответ

Решение

Последняя доступная версия sodiumoxide на crates.io Сейчас 0.0.10 который не поддерживает serde, Вы можете увидеть это, если посмотрите на файл Cargo.toml для тега 0.0.10.

Сейчас вы можете использовать зависимость от github вместо crates.io, пока они не выпустят новую версию. Отредактируйте свой Cargo.toml файл как это:

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

Так как вы используете версию sodiumoxide от github, вам также нужно будет использовать github-версию его оболочки FFI libsodium-sys, Вы можете сделать это, добавив это в свой Cargo.toml:

[replace]
"libsodium-sys:0.0.10" = { git = "https://github.com/dnaq/sodiumoxide/" }
Другие вопросы по тегам