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

时间:2012-12-10 14:24:40

标签: c# c++ .net protocol-buffers protobuf-net

在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 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:0)

你试过这个吗?

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