2 个不稳定版本
0.1.0 | 2020年2月21日 |
---|---|
0.0.0 | 2020年2月14日 |
#1053 in 编码
用于 net-sync
24KB
288 行
跟踪数据修改
该库提供了一种无需样板代码的跟踪结构数据修改的方法。为了优化,仅跟踪调整过的字段。更改将被序列化并发送到通道。
功能
- 监控数据中的修改
- 基于 Serde(不包括字段,...)
- 将修改应用于类型
- 可定制的序列化
功能标志
功能 | 描述 |
---|---|
bincode-serialization |
使用 bincode 进行序列化(默认启用)。 |
rmp-serialization |
使用 rmp-serde 进行序列化。 |
可选实现自己的序列化器元 SerializationStrategy](track/serialization/trait.SerializationStrategy.html)。
示例
首先,将 track
属性添加到您的结构中以标记它为可跟踪。
// imports all necessarily types for the `track` attribute.
use track::preclude::*;
#[track]
#[derive(Debug)]
pub struct Position {
pub x: u32,
pub y: u32,
}
您可以为 track 宏指定一个序列化方法。给出实现 SerializationStrategy 的类型的名称,并确保它对宏是可用的。例如
use track::serialization::bincode::Bincode;
#[track(serialization = "Bincode")]
struct Postition ...
现在让我们进行一些修改并将这些修改应用到其他实例上。
use track::{preclude::*, serialization::bincode::Bincode, Apply, ModificationChannel};
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct Identity {
pub value: u8,
}
impl Identifier for Identity {}
fn main() {
let channel = ModificationChannel::<Identity>::new();
let updated_storage = vec![
(Identity { value: 1 }, Position { x: 0, y: 0 }),
(Identity { value: 2 }, Position { x: 0, y: 0 }),
];
let mut outdated_storage = updated_storage.clone();
// == Make changes to storage ==
make_changes(&channel, updated_storage);
// == Apply changes to outdated storage ==
apply_changes(&channel, &mut outdated_storage);
}
fn make_changes(channel: &ModificationChannel<Identity>, entities: Vec<(Identity, Position)>) {
for (id, mut position) in entities {
let mut position = position.track(channel.sender(), id); /* returns `Tracker` which tracks changes */
// `Tracker` implements `DerefMut`
position.x += 1;
position.y += 1;
} // <- on the `Drop` of `wrapper` changes are serialized and sent on the channel.
}
fn apply_changes(
channel: &ModificationChannel<Identity>,
entities: &mut Vec<(Identity, Position)>,
) {
for event in channel.receiver().try_iter() {
let entity = entities
.iter_mut()
.find(|e| e.0 == event.identifier)
.unwrap();
Apply::apply_to(&mut entity.1, &event.modified_fields, Bincode);
println!("entity updated {:?}", entity);
}
}
有关更深入的示例,请查看 github 上的 示例。
依赖项
~2.5MB
~57K SLoC