我已经决定尝试使用serde进行网络包序列化,但这是一个痛苦的过程。
我根本无法序列化Enum,而且不断收到错误。我在网上也找不到可用的示例,在doc和repo中都没有。
这就是为什么我在寻找:
use serde::{Serialize, Deserialize};
use super::{ClientMessage, ServerMessage};
/// The different messages that can be sent from the client to the lobby.
#[derive(Debug, Serialize, Deserialize)]
pub enum ClientToLobbyMessage {
Quit,
CreateRoom,
JoinRoom(RoomId),
}
impl ClientMessage for ClientToLobbyMessage {
fn from_bytes(bytes: &[u8]) -> Option<ClientToLobbyMessage> {
serde_bytes::deserialize(bytes).ok()
}
}
字符串
这会产生编译时错误:不满足特性界限ClientToLobbyMessage: serde_bytes::Deserialize<'_>
。
在枚举字段上方添加#[serde(with = "serde_bytes")]
也不起作用:
use serde::{Serialize, Deserialize};
use super::{ClientMessage, ServerMessage};
/// The different messages that can be sent from the client to the lobby.
#[derive(Debug, Serialize, Deserialize)]
pub enum ClientToLobbyMessage {
#[serde(with = "serde_bytes")]
Quit,
#[serde(with = "serde_bytes")]
CreateRoom,
#[serde(with = "serde_bytes")]
JoinRoom(RoomId),
}
型
这将在派生宏中产生错误:此函数采用2个参数,但在Serialize
上提供了1个参数,并且Deserialize
不满足特征边界(): serde_bytes::Deserialize<'_>
。
最后,在serde_bytes包中找不到派生宏,如use serde_bytes::{Serialize, Deserialize};
所示:此处导入了Serialize
,但它只是一个特性,没有派生宏。Cargo.toml
文件如下所示:
[dependencies]
serde = { version = "1.0.178", features = ["derive"] }
serde_bytes = "0.11.12"
型
任何尝试向serde_bytes添加特性(就像我对serde所做的那样)的操作都会导致:无法为serde_bytes
选择可解决此冲突错误的版本。
我真的希望我错过了一些明显的东西在这里,但我有点失望,因为我听说serde是超级容易使用。
1条答案
按热度按时间gopyfrb31#
由于您的示例不完整,因此我将假设您的示例为:
字符串
这就产生了一条可怕的错误消息:
型
您的错误在于,您将
serde_bytes
当作一种数据格式来使用,但实际上它不是。它似乎是serde
的一个帮助程序库,用于处理字节数组类型。正如@kmdreko所建议的,您可以改用
bincode
。这是一个真正的编码。就像这样:
型