繁体   English   中英

Protobuf-net按类别/掩码序列化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM