如何使用 Serde 在 Rust 中序列化和反序列化元组?

How do I serialize and deserialize a tuple in Rust using Serde?

我有一个由字符串和 Uuid 组成的元组,我使用 serde_json:

序列化了它
let log_and_id = (String::from("Test string"), test_id);
let log_and_id_serialized = serde_json::to_string(&log_and_id)
        .expect("Serialization failed");
//After serialization (debug print): "[\"Test string\",\"32a8e12d-69d2-421d-a52e-1ee76cc03ed5\"]"

然后我通过网络传输这个序列化值并在另一端接收一个 BytesMut (serialized_tuple),我尝试反序列化它:

//Bytesmut value (debug print): b"\"[\\"Test string\\",\\"32a8e12d-69d2-421d-a52e-1ee76cc03ed5\\"]\""
let (log, operation_state_id) = serde_json::from_slice::<(String, Uuid)>(&serialized_tuple)?;

但我收到以下错误:

ERROR actix_http::response] Internal Server Error: SerdeError(Error("invalid type: string \"[\\"Test string\\",\\"32a8e12d-69d2-421d-a52e-1ee76cc03ed5\\"]\", expected a tuple of size 2", line: 1, column: 68))

以这种方式(反)序列化单个对象曾经用于此代码的其他部分,那么当与元组一起使用时,什么会导致它失败?

您没有序列化的元组,而是序列化的序列化元组。

我的意思是元组的序列化,它是一个 JSON 字符串,再次被序列化。

您可以使用以下代码 (playground) 进行检查:

let serialized_tuple =  b"\"[\\"Test string\\",\\"32a8e12d-69d2-421d-a52e-1ee76cc03ed5\\"]\"";
let serialized_tuple: String =  serde_json::from_slice(serialized_tuple).unwrap();
let (log, operation_state_id) = serde_json::from_slice::<(String, String)>(serialized_tuple.as_bytes()).unwrap();

生成所需的元组。

当然,与其反序列化两次,不如从您的应用程序中删除不必要的序列化(它不在您显示的代码中)。