【问题标题】:protobuf-net into .proto generates enum conflicts?protobuf-net 到 .proto 中会产生枚举冲突吗?
【发布时间】:2012-12-10 14:24:40
【问题描述】:

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

例如,当我们解析所有项目以制作 .proto 文件以将 C++ 应用程序连接到我们的 C# 应用程序时,我们得到了大量的

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

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

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

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

请注意,枚举值使用 C++ 范围规则,这意味着枚举值 是他们类型的兄弟姐妹,而不是它的孩子。

并且没有 C++ 代码。

重点是使编码的 C# 消息至少可以从 C++ 中读取

【问题讨论】:

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


    【解决方案1】:

    目前在 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,但这可以很容易地在新版本中修复(比如使用@ 987654321@) 如果您更喜欢在运行时设置它们而不是用属性装饰。

    【讨论】:

    • 所以会有问题 - 默认值等。这个错误会有官方修复吗?
    • @myWall - 你有什么建议?
    • 自动命名EnumName_EnumField 用于.proto生成
    • @myWallJSON 我当然可以选择这个选项——不过我认为我不应该更改默认值
    • Gravell:Grate!)我们会很快在任何提交中看到它吗? protobuf-net 库是否计划在短期内发生根本性的变化?
    【解决方案2】:

    你试过了吗?

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

    【讨论】:

    • 问题是 - 我们有大量的代码,这实际上不会妨碍 C# 对读取此类消息的支持吗?重点是从 C# 获取 .proto 文件,这些文件恰好与 C++ google protobuf 兼容。这样编码的 C# 消息至少可以从 C++ 读取
    猜你喜欢
    • 2011-05-07
    • 2023-03-19
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多