![](/img/trans.png)
[英]How do I serialize an enum to a number and deserialize from a number via serde-json?
[英]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.