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

Я пытаюсь сериализовать PublicKey структуру оксида натрия (привязки Rust для 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 = "*"

person duesee    schedule 07.07.2016    source источник


Ответы (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/" }
person Wesley Wiser    schedule 07.07.2016
comment
Это действительно нужно знать. Я предполагаю, что большинство новичков используют только crates.io. Вы хотите написать вопрос на GitHub? Если нет, сделаю :-) - person duesee; 07.07.2016
comment
Я позволю тебе это сделать :) - person Wesley Wiser; 07.07.2016