如何从文件中读取结构,替换self的内容

  • 本文关键字:self 替换 结构 文件 读取 rust
  • 更新时间 :
  • 英文 :


我正试图通过对self的一个文件操作来读取整个结构。load函数应该是结构的成员函数:

use std::io;
use std::io::prelude::*;
use std::fs::File;
#[repr(C)]
pub struct ItIsMe<T> {
pub value1: T
// ...
// A lot of items like this
}
trait ItIsMeTrait {
}
impl<T> ItIsMe<T> {
pub fn new(v: T) -> Self {
ItIsMe {
value1: v
}
}
pub fn load(&mut self, file: &mut File) -> io::Result<()> {
// An attempt to read the whole structure
//unsafe{ file.read(self as *mut Self as *mut u8)?;}
Ok(())
}
}
fn main() -> io::Result<()> {
let mut it = ItIsMe::new(55);
println!("value = {}", it.value1);
let mut file = File::open("path_to_file")?;
it.load(&mut file)?;
println!("value = {}", it.value1);
Ok(())
}

我找不到合适的方式来表达这一点。

我知道这个允许从文件中读取结构的功能:

pub fn read_struct<T, R: Read>(reader: &mut R) -> io::Result<T> {
let num_bytes = ::std::mem::size_of::<T>();
unsafe {
let mut mem = ::std::mem::MaybeUninit::uninit().assume_init();
let ptr = slice::from_raw_parts_mut(&mut mem as *mut T as *mut u8, num_bytes);
match reader.read_exact(ptr) {
Ok(()) => Ok(mem),
Err(e) => {
::std::mem::forget(mem);
Err(e)
}
}
}
}

但是,此函数读取结构的另一个实例。是否可以将结构直接反序列化到其自身(self(?

您的最佳选择是使用serde机箱。Serde使您能够快速、轻松地将结构序列化到各种文件格式,以及从各种文件格式反序列化结构。只需将serde和serde您最喜欢的文件类型板条箱添加到Cargo.toml即可开始。一个简单的例子:

use serde::{Deserialize, Serialize}; // 1.0.126
use serde_json::from_reader; // 1.0.64
#[derive(Serialize, Deserialize, Debug)]
struct Foo<T> {
bar: T, //other fields...
}
fn main() {
let data: &[u8] = br#"{
"bar":27
}"#;
let deserialized: Foo<i32> = from_reader(data).unwrap();
println!("{:?}", deserialized);
}

游乐场

你也可以使用不安全的代码,但我强烈建议不要这样做——将serde与你喜欢的文件格式一起使用会更容易、更安全。

最新更新