1

我正在尝试使用 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”之类的东西,但这还不是一回事。显然,编译器正确地理解了第一个示例,因此其中肯定有一些内容......但是什么?

4

0 回答 0