首页 文章

protobuf-net进入.proto会产生枚举冲突吗?

提问于
浏览
6

在C#中,我们在.proto中有命名空间,我们从protobuf-net获得,我们没有得到任何命名空间 . 所以问题是如何使用namespacs / packages生成protobuf-net生成(并使用内部).proto文件 .

例如,当我们解析所有项目以生成.proto文件以将C应用程序连接到我们的C#应用程序时,我们得到了很多

enum AnimationCode {
   None = 0;
   Idle = 1;
   //...
}

enum SessionCode {
   None = 0;
   //...
}

因此,当我们将该统一项目.proto文件提供给protogen编译器时,我们得到了大量的

枚举类型“SessionStateCode”没有名为“None”的值 .

请注意,枚举值使用C作用域规则,这意味着枚举值是其类型的兄弟,而不是它的子级 .

而且没有C代码 .

要点是这样,编码的C#消息至少可以从C中读取

2 回答

  • 2

    protobuf-net目前没有任何代码可以执行自动名称冲突修复,但我很想知道你是否有任何提议 . 另一种选择是:

    enum AnimationCode {
            [ProtoEnum(Name="AnimationCode_None")]
            None = 0,
            Idle = 1
        }
    

    在这里,.proto将在生成scema时使用 AnimationCode_None ;事实上,它将是:

    enum AnimationCode {
       AnimationCode_None = 0;
       Idle = 1;
    }
    

    我已经检查了 MetaType / ValueMember API,看起来目前在运行时很难设置 .Name 但是如果您更喜欢在运行时设置它们,那么可以在新版本中轻松修复(如this similar enum/MetaType fix)而不是用属性装饰 .

  • 0

    你试过这个吗?

    package MyNamespace{
        enum AnimationCode {
           None = 0;
           Idle = 1;
           //...
        }
    }
    

相关问题