簡體   English   中英

如何使用 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 字符串,再次被序列化。

您可以使用此代碼( 操場)檢查這一點:

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();

這會產生所需的元組。

當然,您應該從應用程序中刪除不必要的序列化,而不是反序列化兩次(它不在您顯示的代碼中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM