【发布时间】:2021-09-09 15:23:35
【问题描述】:
考虑以下代码:
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct MyStruct {
a: u32,
b: u32
}
#[derive(Serialize, Deserialize)]
#[serde(rename = "MyStruct")]
struct AlsoMyStruct {
a: u32,
b: u32
}
我想知道我是否可以安全地执行以下操作:
let ser = any_encoding::serialize(&MyStruct{a: 33, b: 44}).unwrap();
let deser: AlsoMyStruct = any_encoding::deserialize(&ser).unwrap();
其中any_encoding 是例如bincode、json 或任何其他支持 Serde 的编码。在我看来,这应该可以很好地工作:这两个结构具有相同的名称(我明确地将AlsoMyStruct 重命名为"MyStruct")和完全相同的字段:相同的字段名称、相同的字段类型、相同的字段顺序。
但是,我想知道:这实际上 保证 可以工作吗?或者是否有一些其他的、极端情况、可能依赖于平台的、不可预见的信息,Serde 序列化器/反序列化器可能包含在MyStruct / AlsoMyStruct 的表示中,这可能导致两种表示不兼容?
【问题讨论】:
-
我不知道 bincode 是如何工作的,但是在 rust 中,这些结构不能保证是相同的,如果你想的话,你必须使用
#[repr(C)]:doc.rust-lang.org/nomicon/repr-rust.html -
取决于您选择的格式,如果格式没有排序是的,如 json,bincode 有点特殊,所以我想说它应该与 bincode 相同。
-
Remote derive 似乎相邻,如果不严格适用的话。
-
实际上,如果我理解正确,是的,如果您的结构的 rust 定义没有改变并且具有相同的值,那么它应该是相同的序列化格式,是否订购(当然使用相同的版本),但是正如 jonasbb 所说,不能保证反序列化到完全相同的值(边缘情况)