我正在尝试使用 serde_tokio 序列化 cbor。
我可以制作一个简单的程序,但我需要将 tokio_serde::SymmetricallyFramed::new() 实际存储在一个结构中以多次使用它。(它消耗插座,这很酷)。
我似乎无法编写存储值的类型。
use futures::prelude::*;
use tokio::net::TcpStream;
use tokio_serde::formats::*;
use tokio_util::codec::{FramedWrite, LengthDelimitedCodec};
#[tokio::main]
pub async fn main() {
// Bind a server socket
let socket = TcpStream::connect("127.0.0.1:17653").await.unwrap();
// Delimit frames using a length header
let length_delimited = FramedWrite::new(socket, LengthDelimitedCodec::new());
// Serialize frames with JSON
let mut serialized = tokio_serde::SymmetricallyFramed::new(length_delimited, SymmetricalCbor::default());
// Send the value
serialized
.send(vec![1i32,2,3])
.await
.unwrap()
}
产生正确的输出。(取自 tokio-serde crate 中的 json 示例,此处:https ://github.com/carllerche/tokio-serde/blob/master/examples/client.rs
我想将“序列化”放入一个结构中(并隐藏它是如何在 fn 中创建的),但我似乎无法编写正确的类型。
use futures::prelude::*;
use serde_cbor;
use tokio::net::TcpStream;
use tokio_serde::formats::*;
use tokio_util::codec::{FramedWrite, LengthDelimitedCodec};
type CborWriter = tokio_serde::Framed<tokio_util::codec::FramedWrite<tokio::net::TcpStream, tokio_util::codec::LengthDelimitedCodec>, serde_cbor::Value, serde_cbor::Value, tokio_serde::formats::Cbor<serde_cbor::Value, serde_cbor::Value>>;
// something like this has been suggested, but so far no luck.
// fn setup_writer(socket: tokio::net::TcpStream) -> impl Sink<??>+Debug {
fn setup_writer(socket: tokio::net::TcpStream) -> CborWriter {
// Delimit frames using a length header
let length_delimited = FramedWrite::new(socket, LengthDelimitedCodec::new());
// Serialize frames with CBOR
let serialized = tokio_serde::SymmetricallyFramed::new(length_delimited, SymmetricalCbor::default());
return serialized;
}
#[tokio::main]
pub async fn main() {
// Bind a server socket
let socket = TcpStream::connect("127.0.0.1:17653").await.unwrap();
// Serialize frames with CBOR
let mut serialized = setup_writer(socket);
// Send the value
serialized
.send(serde_cbor::Value::Array(vec![serde_cbor::Value::Integer(1i128),
serde_cbor::Value::Integer(2i128),
serde_cbor::Value::Integer(3i128)]))
.await
.unwrap()
}
但是,我不想把 cbor::Value 放进去。我应该能够把 Serializable 对象放进去。所以我显然在这里走错了方向。tokio-serde crate 中的 JSON 示例很乐意输入/输出 serde_json::Value,但我认为我应该这样做。
提出了关于 Discord 的建议,将第一个示例更改为:
let mut serialized: () = tokio_serde::SymmetricallyFramed::new(length_delimited, SymmetricalCbor::default());
让编译器告诉我类型是什么:
= note: expected unit type `()`
found struct `tokio_serde::Framed<tokio_util::codec::FramedWrite<tokio::net::TcpStream, tokio_util::codec::LengthDelimitedCodec>, _, _, tokio_serde::formats::Cbor<_, _>>`
好吧,我不能将_放入类型别名中,或者直接写它。我认为它应该说“impl Serialize”之类的东西,但这还不是一回事。显然,编译器正确地理解了第一个示例,因此其中肯定有一些内容......但是什么?