[英]Protobuf-net serialize by category/mask
举一个具体的例子,这个问题可能是最简单的。 我有一个代表游戏中玩家可控单位的类。 将本机序列化到磁盘时,我想保存所有内容。 当我向其他玩家发送网络更新时,我想发送“所有内容”的子集,其中仅包括我知道已更改的内容。
[ProtoContract]
public class Unit
{
[ProtoMember(1, IsRequired=false)
public Vector3 Position;
[ProtoMember(2, IsRequired=false)
public Unit Target;
}
依此类推,所有成员都标记为可选,因此在接收端,它将正确解码消息,而不管其是否包含位置更新,目标更新或两者。
但是..我如何序列化不包含所有标有[ProtoMember]成员的消息?
请记住,这将发生在性能关键的代码位置,这些位置也无法进行堆分配,我可能想要20多种不同属性的任意组合。
Protobuf-net支持预先存在的模式(由其他一些序列化器/ UI工具使用):
public bool ShouldSerializeTarget() {...}
public bool ShouldSerializePosition() {...}
注意:这些方法可以是私有的,除非具有强制访问检查的运行时。
在控制选项方面-我可能会使用标志枚举:
return (serializeFlags & UnitMembers.Target) != 0;
同
[Flags]
public enum UnitMembers {
None =0,
Position = 1,
Target = 2,
// 4, 8, 16, 32, etc
}
也就是说,可以控制在一个空间32名成员int
基enum或64名成员在空间long
基枚举。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.