9 个版本
0.2.2 | 2019 年 11 月 21 日 |
---|---|
0.2.1 | 2019 年 10 月 31 日 |
0.1.5 | 2019 年 8 月 10 日 |
0.1.4 | 2019 年 7 月 31 日 |
0.1.0 | 2018 年 7 月 21 日 |
#1692 在 编码
每月 477 次下载
在 10 个crate中(通过 serde_traitobject)使用
16KB
257 代码行
relative
一种用于封装 vtable 引用的类型,以便它们可以在运行同一二进制文件的其他进程之间安全地传递。
当(反)序列化时,引用相对于基础进行调整,这就是它能够在多个调用下在不同地址动态加载的多个二进制文件之间工作的原因。
通过将build_id
与相对指针一起序列化来检查是否是相同的二进制文件,这将在反序列化时验证。
示例
本地进程
use std::{fmt::Display, mem::transmute, raw::TraitObject};
let mut x: Box<dyn Display> = Box::new("hello world");
let x_ptr: *mut dyn Display = &mut *x;
let x_ptr: TraitObject = unsafe { transmute(x_ptr) };
let relative = unsafe { Vtable::<dyn Display>::from(&*x_ptr.vtable) };
// send `relative` to remote...
远程进程
// receive `relative`
let x: Box<&str> = Box::new("goodbye world");
let x_ptr = Box::into_raw(x);
let y_ptr = TraitObject { data: x_ptr.cast(), vtable: relative.to() as *const () as *mut () };
let y_ptr: *mut dyn Display = unsafe { transmute(y_ptr) };
let y: Box<dyn Display> = unsafe { Box::from_raw(y_ptr) };
println!("{}", y);
// prints "goodbye world"
许可证
根据以下任一许可证授权
- Apache 许可证2.0版,(LICENSE-APACHE.txt 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT.txt 或 http://opensource.org/licenses/MIT)
任选。
除非你明确说明,否则任何有意提交以包含在你根据 Apache-2.0 许可证定义的工作中的贡献,都应按上述方式双许可,不附加任何额外条款或条件。
依赖关系
~0.6–1.6MB
~28K SLoC