[−][src]Struct fastnbt::de::Deserializer
Deserializer for getting a T
from some NBT data. Quite often you will need
to rename fields using serde, as most Minecraft NBT data has inconsistent
naming. The examples below show this with the rename_all
attribute. See
serde
s other attributes for more.
You can take advantage of the lifetime of the input data to save allocations
for things like strings. You can also deserialize any Array or List of
primitive type as &'a [u8]
to avoid allocating this data. See example
below.
When deserializing integral types, the values are range checked to prevent
overflow from occurring. If an overflow does occur you will get a
Error::IntegralOutOfRange
error.
Example of deserializing player.dat
use serde::Deserialize; #[derive(Deserialize, Debug)] #[serde(rename_all = "PascalCase")] struct PlayerDat { data_version: i32, inventory: Vec<InventorySlot>, ender_items: Vec<InventorySlot>, } #[derive(Deserialize, Debug)] struct InventorySlot { id: String, }
Examples of avoiding allocation
We can easily avoid allocations of String
s using &'a str
where 'a
is
the lifetime of the input data.
use serde::Deserialize; #[derive(Deserialize, Debug)] struct InventorySlot<'a> { id: &'a str, // we avoid allocating a string here. }
Here we're avoiding allocating memory for the various heightmaps found in chunk data.
The PackedBits
type is used as a wrapper for the way Minecraft's Anvil format packs various
lists of numbers.
use fastnbt::anvil::PackedBits; use serde::Deserialize; #[derive(Deserialize, Debug)] #[serde(rename_all = "SCREAMING_SNAKE_CASE")] pub struct Heightmaps<'a> { #[serde(borrow)] pub motion_blocking: Option<PackedBits<'a>>, pub motion_blocking_no_leaves: Option<PackedBits<'a>>, pub ocean_floor: Option<PackedBits<'a>>, pub world_surface: Option<PackedBits<'a>>, #[serde(skip)] unpacked_motion_blocking: Option<Vec<u16>>, }
Example from region file
use fastnbt::anvil::{Chunk, Region}; use fastnbt::de::from_bytes; fn main() { let args: Vec<_> = std::env::args().skip(1).collect(); let file = std::fs::File::open(args[0].clone()).unwrap(); let mut region = Region::new(file); let data = region.load_chunk(0, 0).unwrap(); let chunk: Chunk = from_bytes(data.as_slice()).unwrap(); println!("{:?}", chunk); }
Implementations
impl<'de> Deserializer<'de>
[src]
pub fn from_bytes(input: &'de [u8]) -> Self
[src]
Trait Implementations
impl<'de, 'a> Deserializer<'de> for &'a mut Deserializer<'de>
[src]
type Error = Error
The error type that can be returned if some error occurs during deserialization. Read more
fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_struct<V>(
self,
_name: &'static str,
_fields: &'static [&'static str],
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
[src]
self,
_name: &'static str,
_fields: &'static [&'static str],
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_char<V>(self, _: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_enum<V>(
self,
_name: &'static str,
_variants: &'static [&'static str],
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
[src]
self,
_name: &'static str,
_variants: &'static [&'static str],
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_str<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_string<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_unit_struct<V>(self, _: &'static str, _: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_newtype_struct<V>(
self,
_: &'static str,
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
[src]
self,
_: &'static str,
visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_tuple<V>(self, _: usize, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_tuple_struct<V>(
self,
_name: &'static str,
_len: usize,
_visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
[src]
self,
_name: &'static str,
_len: usize,
_visitor: V
) -> Result<V::Value> where
V: Visitor<'de>,
fn deserialize_map<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value> where
V: Visitor<'de>,
[src]
V: Visitor<'de>,
fn deserialize_i128<V>(
self,
visitor: V
) -> Result<<V as Visitor<'de>>::Value, Self::Error> where
V: Visitor<'de>,
[src]
self,
visitor: V
) -> Result<<V as Visitor<'de>>::Value, Self::Error> where
V: Visitor<'de>,
fn deserialize_u128<V>(
self,
visitor: V
) -> Result<<V as Visitor<'de>>::Value, Self::Error> where
V: Visitor<'de>,
[src]
self,
visitor: V
) -> Result<<V as Visitor<'de>>::Value, Self::Error> where
V: Visitor<'de>,
fn is_human_readable(&self) -> bool
[src]
Auto Trait Implementations
impl<'de> RefUnwindSafe for Deserializer<'de>
impl<'de> Send for Deserializer<'de>
impl<'de> Sync for Deserializer<'de>
impl<'de> Unpin for Deserializer<'de>
impl<'de> UnwindSafe for Deserializer<'de>
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> Pointable for T
pub const ALIGN: usize
type Init = T
The type for initializers.
pub unsafe fn init(init: <T as Pointable>::Init) -> usize
pub unsafe fn deref<'a>(ptr: usize) -> &'a T
pub unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T
pub unsafe fn drop(ptr: usize)
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,