Преобразовать структуру в байтовый массив и прочитать это с помощью реализации `std :: io:: Read` признака

#rust

#Ржавчина

Вопрос:

Я пытаюсь реализовать std::io::Read признак для структуры.

Моя цель — преобразовать obj в байтовый массив и прочитать его с помощью реализации Read trait.

Ниже приведен код, который я написал до сих пор.

 use chrono::{DateTime, Utc};
use std::io::Error;
use std::io::Read;
use std::vec::Vec;
use std::str;

use super::{Chain, Transaction};

// The struct I need to convert to byte array and add the Read impl.

#[derive(Debug)]
pub struct Block {
    index: u64,
    timestamp: DateTime<Utc>,
    transactions: Vec<Transaction>,
    proof: i64,
    previous_hash: String,
}

// The Read trait implementation for Block

impl Read for Block {
    fn read(amp;mut self, buf: amp;mut [u8]) -> std::result::Result<usize, Error> {
        let bytes: amp;[u8] = unsafe { any_as_u8_slice(amp;self) };
        buf.clone_from_slice(bytes);
        Ok(bytes.len())
    }
}

// Function that converts to byte array. (found on stackoverflow)

unsafe fn any_as_u8_slice<T: Sized>(p: amp;T) -> amp;[u8] {
    ::std::slice::from_raw_parts((p as *const T) as *const u8, ::std::mem::size_of::<T>())
}
 

При выполнении кода таким образом я получаю сообщение об ошибке.

 let mut buffer: Vec<u8> = Vec::new();
let result = block.read(buffer.as_mut());
 

ОШИБКА

поток ‘main’ запаниковал при ‘срезы назначения и источника имеют разную длину’, /Users/harsh/.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/slice/mod.rs:2554:9

Я новичок в Rust, пытаюсь учиться, перенося другую программу на Rust.

Как мне скопировать amp;[u8] в другой amp;mut [u8], который является vec. (Исправить значение чтения для блока)?

И есть ли лучший способ сделать это? Преобразовать объект в байтовый массив и вернуть его из реализации чтения.

Комментарии:

1. TLDR, но, похоже, bincode может помочь.

2. Вы уверены, что это то, что вы хотите? Чтение необработанных байтов из a Block не будет содержать содержимого transactions or previous_hash .

3. Также amp;[u8] уже реализовано Read , что вы можете использовать это вместо этого. Попытка реализовать Read подобное содержимое напрямую было бы в лучшем случае неудобно, поскольку Read er должен отслеживать, что было прочитано, а что нет.

4. ДА. Я заметил это. Спасибо. Я пытаюсь использовать bincode, чтобы разобраться в этом. Спасибо! @kmdreko