apache / apache/fory

[Rust] Support deserialize by populate passed mut ref

Open
#2,552 4 comments 0 reactions 1 assignee Claimed by @Tinuvile View on GitHub
enhancement rust
Dominant language
Java
Stars
4.5k
Forks
443
Avg merge
5h 59m
Merged PRs (30d)
77

Description

### Feature Request

Currently fory rust provide following deserialize API:
```rust
pub fn deserialize(&self, bf: &[u8]) -> Result {
let mut reader = Reader::new(bf);
let meta_offset = self.read_head(&mut reader)?;
let mut context = ReadContext::new(self, reader);
if meta_offset > 0 {
context.load_meta(meta_offset as usize);
}
::deserialize(&mut context)
}
```

It relies on compiler `Return Value Optimization (RVO)`, which won't work always. And the compiler will copy small struct always.

### Is your feature request related to a problem? Please describe

` pub fn deserialize(&self, bf: &[u8]) -> Result` API may introduce extra copy.

### Describe the solution you'd like

Add a new API to populate passed struct directly.

```rust
pub fn deserialize_into(&self, bf: &[u8], output: &mut T) -> Result<(), Error> {
let mut reader = Reader::new(bf);
let meta_offset = self.read_head(&mut reader)?;
let mut context = ReadContext::new(self, reader);
if meta_offset > 0 {
context.load_meta(meta_offset as usize);
}
::deserialize_into(&mut context, output)
}
```

### Describe alternatives you've considered

_No response_

### Additional context

_No response_

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.