这个问题可能是最简单的一个具体例子。我有一个代表游戏中玩家可控单位的类。当我将此单元序列化到磁盘时,我想保存所有内容。当我向其他玩家发送网络更新时,我想发送一切“'所有内容”。仅包括我知道已改变的事物。
[ProtoContract]
public class Unit
{
[ProtoMember(1, IsRequired=false)
public Vector3 Position;
[ProtoMember(2, IsRequired=false)
public Unit Target;
}
依此类推,所有成员都被标记为可选,因此在接收端它将正确解码一条消息,无论它是否包含位置更新,目标更新,或两者兼而有之。
但是..如何序列化一条不包含[ProtoMember]标记的所有成员的消息?
请记住,这将发生在性能关键代码位置,这些位置也无法进行堆分配,我可能需要20多个不同属性的任意组合。
答案 0 :(得分:1)
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
}
这允许您控制基于int
的枚举空间中的32个成员,或基于long
的枚举空间中的64个成员。