(这是从类似问题的评论中 Shamelessly stolen and adapted from Renato Zannon 的评论 )
也许像bincode
这样的解决方案适合你的情况? 这里是一个可行的摘录:
Cargo.toml
[package]
name = "foo"
version = "0.1.0"
authors = ["An Devloper <an.devloper@example.com>"]
edition = "2018"
[dependencies]
bincode = "1.0"
serde = { version = "1.0", features = ["derive"] }
main.rs
use serde::{Deserialize, Serialize};
use std::fs::File;
#[derive(Serialize, Deserialize)]
struct A {
id: i8,
key: i16,
name: String,
values: Vec<String>,
}
fn main() {
let a = A {
id: 42,
key: 1337,
name: "Hello world".to_string(),
values: vec!["alpha".to_string(), "beta".to_string()],
};
let mut f = File::create("/tmp/output.bin").unwrap();
bincode::serialize_into(&mut f, &a).unwrap();
let bytes = bincode::serialize(&a).unwrap();
println!("{:?}", bytes);
}
您随后就可以将字节发送到任何地方。我假设您已经意识到了朴素地发送字节时可能存在的问题(例如潜在的字节序或版本问题),但为了避免遗漏,我还是提一下吧 ^_^。
let s: MyStruct = unsafe { std::mem::transmute(*bytes) };
- d9nglelet s: MyStruct = unsafe { std::mem::transmute(*bytes) };
是可行的,但我认为let p: *const [u8; std::mem::size_of::<MyStruct>()] = bytes as *const [u8; std::mem::size_of::<MyStruct>()]; let s: MyStruct = unsafe { std::mem::transmute(*p) };
也是不错的选择。 - lechat