Comments (13)
Seems reasonable! I would be prepared to consider a PR for this.
from bytes.
sigh looks like this won't work due to coherence (as usual in Rust) :(
ToOwned
can't be implemented on types that have Clone
, and Bytes
without Clone
can't be Copy
able either, and losing these two seems bad.
Standard library doesn't have this issue with &[u8]
/ &str
/ etc. because these live in the same crate as ToOwned
and so can be specialised, even though these types implement Clone
and Copy
too.
from bytes.
We probably want to change Bytes to a dst for this and other reasons.
pub struct Bytes {
bytes: [u8],
}
from bytes.
That would work (although would be a breaking change). If you're open to a PR, I can do both together.
from bytes.
What is the target Rust version for serde_bytes though? I believe the above can be technically safe only with #[repr(transparent)]
which is stable in Rust 1.28+, but I remember from other discussion that you're supporting older versions of Rust too?
from bytes.
repr(C)
is sufficient in this case because we don't need FFI guarantees. But major versions are allowed to raise the rustc requirement.
from bytes.
To make sure we're on the same page - we're both talking about safety of transmute::<&[u8], &Bytes>
right?
If so, I'm not sure repr(C)
is enough. It would be enough for thin pointers, because then we only care that start address of the first field == address of the struct itself, but fat pointers have own internal representation that is AFAIK not guaranteed to be compatible without repr(transparent)
.
from bytes.
transmute::<&[u8], &Bytes>
only requires repr(C). The guarantees of repr(transparent) are the same as repr(C) plus one extra guarantee about how the struct is seen by calling conventions of extern functions, particularly in calling conventions that treat all struct types differently from primitive types.
Transmuting is not the same as FFI so repr(transparent) vs repr(C) has no bearing on transmute (except when transmuting FFI function pointers).
from bytes.
Huh, I thought they can be different in regards to memory layout too (especially around padding after last field), but apparently not. I stand corrected.
Do you want to perform this rewrite to DST yourself or would you rather prefer a PR?
from bytes.
I won't get to it soon so a PR would be better. Thanks!
from bytes.
This is somewhat bigger change, so it will take me some time to get around to it too, but I'll try to revisit this in a week or so.
from bytes.
Should ByteBuf
in that case be changed to deref to Bytes
instead of [u8]
?
from bytes.
Fixed in 0.11.0.
from bytes.
Related Issues (20)
- Update bincode dev-dependency to 1 HOT 1
- Implement support for SmallVec<u8; N>? HOT 2
- Working with more complex types is difficult HOT 1
- Removing From<Vec<u8>> and From<ByteBuf> was mistake HOT 1
- Tests fail with --no-default-features on published "serde_bytes" 0.11.3 crate HOT 3
- Allow `Cow<'a, [u8]>` to be deserialized even when visitor receives owned bytes. HOT 3
- Implement (de-)serializing for `[u8; N]` HOT 2
- How to handle Vec<Vec<u8>> HOT 1
- Functionality of #[serde(with = "serde_bytes")] for deserialization of &[u8] HOT 7
- How to use this crate without use of struct fields
- Support for human-readable formats? HOT 5
- Is there a way to borrow when serialize and own when deserialize? HOT 1
- `#[serde(with = "serde_bytes")]` does not work in no_std. HOT 1
- Consider sealing serde_bytes::Serialize and Deserialize traits
- Support for Arc HOT 2
- support byte array of any size. HOT 1
- `Vec<Vec<u8>>` conversion support missing HOT 1
- Consider not using specialization even after it lands HOT 2
- Cannot deserialise into &[u8] HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from bytes.