2016-07-07 9 views
1

PublicKey sodiumoxide (libsodium의 녹청 바인딩) 구조체 (예 : JSON,하지만 바이너리도 괜찮음)를 직렬화하려고합니다.JSON에 NaOH의 PublicKey를 직렬화

여기 내 코드입니다 :

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 :: 특성을 직렬화를 구현해야 하더군요을. 그러나 여기에 명시된대로 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 = "*" 

답변

2

crates.iosodiumoxide의 최신 버전은 현재 serde을 지원하지 않습니다 0.0.10입니다. Cargo.toml file for the 0.0.10 tag을 보면이 사실을 알 수 있습니다.

지금 할 수있는 일은 새로운 버전을 출시 할 때까지 crates.io 대신 github의 종속성을 사용하는 것입니다. 이처럼 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/" } 
+0

정말 알아야합니다. 나는 대부분의 초보자가 crates.io만을 사용한다고 가정합니다. GitHub에 문제를 쓰는 데 관심이 있습니까? 그렇지 않다면, 나는 할 것이다 :-) – duesee

+0

나는 그렇게하도록 할 것이다. :) –