根据上一篇关于protobuf的官方C#版本额外扩展记录,当改造完成后,结合实际C#开发(我主要使用Unity进行开发)需求,其实我们还可以做很多事情。
官方生成C#后预留的空间
当我们使用protoc的--csharp_out
生成PB的C#代码之后,大体结构是这样的:
public sealed partial class MSG : pb::IMessage<MSG> {}
通过具体pb消息的代码,我们可以发现有两点可以助力我们对他进行扩展:
- 生成的消息类被
partial
关键字声明; - 生成的消息继承自接口
pb::IMessage
。
我们后续的扩展,便是建立在这两条的基础之上。
我们需要为消息定义ID
基于PB消息声明为partial
且继承于接口这一事实,我的思路是:将PB继承自一个基类,且使用partial
实现。
为此,我们先声明一个MsgBase
:
public abstract class MsgBase
{
public virtual int Msgid => 0;
}
将msgid
设定为virtual
,是基于我们自己的需求,可以根据自身需求进行调整。
这样,便可以根据之前解析FileDescriptorSet
所得到的的数据,自己生成对应的C#文件即可。比如之前的MSG
类,就可以扩展生成如下代码:
public sealed partial class MSG : MsgBase
{
public override int Msgid => 1001;
}
关于代码自动生成
这是之前走过的一个坑,所以碎碎念一下:使用的是C#的Razor,不过不得不吐槽,在非windows环境下使用这些简直是一场噩梦。
好了全篇到此结束,希望这些记录能带给一些人以启发,也算这篇文章有价值了。
网友评论