unity protobuf使用repeated字段转c#文件后List只读问题

proto文件里如果将字段定义为repeated后

 

 则使用protobuf-net编译为c#文件后,使用repeated修饰的字段会变为一个List集合如下图为编译后的C#文件

 但是这个文件里的List如上图红框所示只有get属性并且为readonly,虽然在外面使用时可以通过list.AddRange的方式给集合赋值,但是在数据灵活存储上还是有很多的限制,所以想怎么可以让编译后的c#文件里的List自动加上Set属性并且去掉readonly

经过查看protobuf-net的文件后发现修改里面的csharp.xslt文件就可以实现

具体方式如下:

打开protobuf-net>ProtoGen>csharp.xslt文件,这个文件属于一个配置文件,它就是决定proto文件生成一个怎样的c#文件,这里我们继续我们的修改目标:加上Set和去掉readonly 所以打开它

 打开后搜索Label_Repeated,里面应该只有这一个

 找到之后就找到了对于Repeated修饰的proto文件里编译成C#文件的配置如上图大红框内容就是啦

接下来是重点:

找到readonly所在的这一行,如下图红框

然后删掉红框内容 <xsl:if test="not($optionXml)">readonly</xsl:if>

删掉后如下

然后进行第二步:

还是这里找到如下图标记内容删掉

删掉这段注释后保存文件 

 然后我们重新将proto文件编译成c#文件,结果如下:

我们发现实现了我们想要的效果,使用repeated修饰的proto文件字段使用protobuf-net编译成c#文件后readonly没有了,并且可以set,到这里我们的目的就达成了,如有更多的研究欢迎留言讨论

本帖内容经过测试,真实有效

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity Protobuf是一种在Unity游戏开发中常用的序列化格式,它可以方便地将游戏对象化为二进制数据以便在网络传输或数据存储中使用Unity Protobuf主要由Google开发,并提供了C++库用于实现序列化和反序列化功能。 Unity Protobuf使用流程大致如下: 首先,需要在Unity项目中导入Protobuf的C++库,并通过引用命名空间将其包含到代码中。 然后,根据游戏中需要序列化的数据结构,在Protobuf的定义文件中编写相应的消息类型,可以定义消息的字段类型、字段名以及字段的标识号。消息类型的定义类似于结构体或类的定义,可以嵌套定义消息类型。 接着,使用工具根据消息类型的定义文件生成C++的消息类,该类提供了序列化和反序列化的方法,可以方便地将消息进行编码和解码。 在Unity代码中,可以使用生成的C++消息类来创建消息对象,设置消息对象的字段值,并将消息对象进行序列化。 在网络传输中,可以使用Socket或其他网络库将序列化后的消息发送到目标端。 在目标端,可以使用Protobuf的C++库将接收到的二进制数据进行反序列化,恢复成原始的消息对象,进而使用其中的字段值。 Unity Protobuf的好处是它提供了高效的序列化和反序列化方式,可以更好地控制网络传输的数据大小和数据格式。它还支持跨平台的数据交换,可以方便地在不同的游戏客户端和服务器之间进行数据交互。此外,Unity Protobuf还支持消息的版本控制和扩展,可以方便地修改和升级消息定义。 总之,Unity Protobuf是一种强大且灵活的序列化工具,它在Unity游戏开发中有广泛的应用,可以提高网络传输的效率和数据格式的灵活性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值