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

时间:2014-08-23 05:07:12

标签: c# protocol-buffers protobuf-net

这个问题可能是最简单的一个具体例子。我有一个代表游戏中玩家可控单位的类。当我将此单元序列化到磁盘时,我想保存所有内容。当我向其他玩家发送网络更新时,我想发送一切“'所有内容”。仅包括我知道已改变的事物。

[ProtoContract]
public class Unit
{
   [ProtoMember(1, IsRequired=false)
   public Vector3 Position;

   [ProtoMember(2, IsRequired=false)
   public Unit Target;
}

依此类推,所有成员都被标记为可选,因此在接收端它将正确解码一条消息,无论它是否包含位置更新,目标更新,或两者兼而有之。

但是..如何序列化一条不包含[ProtoMember]标记的所有成员的消息?

请记住,这将发生在性能关键代码位置,这些位置也无法进行堆分配,我可能需要20多个不同属性的任意组合。

1 个答案:

答案 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个成员。