是否可以使用 protobuf-net 为扩展名为 'FieldOptions' 的 proto2 文件生成 C# 文件?
Is it possible to generate C# files using protobuf-net for proto2 files with extension of 'FieldOptions'?
我有一个使用 proto2 语法的原型文件。我正在尝试使用 protogen 自动生成 C# 文件。虽然我可以毫无错误地生成文件,但在构建项目时出现错误(C# 文件是 Visual Studio 中 .Net 5 项目的一部分)。错误看起来像:
error CS0400: The type or namespace name 'Google' could not be found in the global namespace (are you missing an assembly reference?)
我已经在正确的路径中添加了 'descriptor.proto' 但它似乎对 protogen 自动生成 C# 文件的方式没有任何影响。
myproto.proto
syntax = "proto2";
import "google/protobuf/descriptor.proto";
package test;
extend google.protobuf.FieldOptions {
optional string sampleValue = 50004;
}
message TestMessage {
required string id = 1;
optional float value = 2;
optional string sample_val = 3;
}
myproto.cs
// <auto-generated>
// This file was generated by a tool; you should avoid making direct changes.
// Consider using 'partial classes' to extend these types
// Input: myproto.proto
// </auto-generated>
#region Designer generated code
#pragma warning disable CS0612, CS0618, CS1591, CS3021, IDE0079, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192
namespace Test
{
[global::ProtoBuf.ProtoContract()]
public partial class TestMessage : global::ProtoBuf.IExtensible
{
private global::ProtoBuf.IExtension __pbn__extensionData;
global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
=> global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
[global::ProtoBuf.ProtoMember(1, Name = @"id", IsRequired = true)]
public string Id { get; set; }
[global::ProtoBuf.ProtoMember(2, Name = @"value")]
public float Value
{
get => __pbn__Value.GetValueOrDefault();
set => __pbn__Value = value;
}
public bool ShouldSerializeValue() => __pbn__Value != null;
public void ResetValue() => __pbn__Value = null;
private float? __pbn__Value;
[global::ProtoBuf.ProtoMember(3, Name = @"sample_val")]
[global::System.ComponentModel.DefaultValue("")]
public string SampleVal
{
get => __pbn__SampleVal ?? "";
set => __pbn__SampleVal = value;
}
public bool ShouldSerializeSampleVal() => __pbn__SampleVal != null;
public void ResetSampleVal() => __pbn__SampleVal = null;
private string __pbn__SampleVal;
}
public static partial class Extensions
{
public static string GetsampleValue(this global::Google.Protobuf.Reflection.FieldOptions obj)
=> obj == null ? default : global::ProtoBuf.Extensible.GetValue<string>(obj, 50004);
public static void SetsampleValue(this global::Google.Protobuf.Reflection.FieldOptions obj, string value)
=> global::ProtoBuf.Extensible.AppendValue<string>(obj, 50004, value);
}
}
#pragma warning restore CS0612, CS0618, CS1591, CS3021, IDE0079, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192
#endregion
生成的 'myproto.cs' 中两种方法的静态 class Extensions
均发生错误。是不是可以只使用 protobuf-net 包而不使用任何额外的 Google 包?如果不是,那么我必须添加哪个包作为附加依赖项?我可能遗漏了一些微不足道的东西,但我现在似乎无法理解。
这里不需要Google引用;您有 extended FieldOptions
,这是与字段相关的 描述符元数据类型 。 protobuf-net 在 protobuf-net.Reflection 包中有一个实现,正是在预期的位置:Google.Protobuf.Reflection.FieldOptions
.
但是!我怀疑这是否会达到您的预期。在这种情况下,您已经定义了一个“自定义选项”。自定义选项 与运行时实例数据无关 - 它们是 .proto DSL 的一部分,通常用于 影响代码生成 ;在你的情况下,它会是这样的:
optional string sample_val = 3 [sampleValue= "ExtensionTypeName"];
(或类似的东西)
这里的要点是 value ("ExtensionTypeName"
) 仅在谈论 schema 字段 时适用,即为什么它悬挂在 FieldOptions
之外(代表模式字段定义的 实例 )。它与您在运行时使用 TestMessage
没有任何关系。此外:protobuf-net 目前没有将自定义选项打包到生成的 C# 中(它可以做,大概是作为属性中的 base-64 块,或类似的 - 它目前没有).
因此:退一步说:您的扩展 sampleValue
对您有何意义,您认为它与哪些实例相关?
我有一个使用 proto2 语法的原型文件。我正在尝试使用 protogen 自动生成 C# 文件。虽然我可以毫无错误地生成文件,但在构建项目时出现错误(C# 文件是 Visual Studio 中 .Net 5 项目的一部分)。错误看起来像:
error CS0400: The type or namespace name 'Google' could not be found in the global namespace (are you missing an assembly reference?)
我已经在正确的路径中添加了 'descriptor.proto' 但它似乎对 protogen 自动生成 C# 文件的方式没有任何影响。
myproto.proto
syntax = "proto2";
import "google/protobuf/descriptor.proto";
package test;
extend google.protobuf.FieldOptions {
optional string sampleValue = 50004;
}
message TestMessage {
required string id = 1;
optional float value = 2;
optional string sample_val = 3;
}
myproto.cs
// <auto-generated>
// This file was generated by a tool; you should avoid making direct changes.
// Consider using 'partial classes' to extend these types
// Input: myproto.proto
// </auto-generated>
#region Designer generated code
#pragma warning disable CS0612, CS0618, CS1591, CS3021, IDE0079, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192
namespace Test
{
[global::ProtoBuf.ProtoContract()]
public partial class TestMessage : global::ProtoBuf.IExtensible
{
private global::ProtoBuf.IExtension __pbn__extensionData;
global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
=> global::ProtoBuf.Extensible.GetExtensionObject(ref __pbn__extensionData, createIfMissing);
[global::ProtoBuf.ProtoMember(1, Name = @"id", IsRequired = true)]
public string Id { get; set; }
[global::ProtoBuf.ProtoMember(2, Name = @"value")]
public float Value
{
get => __pbn__Value.GetValueOrDefault();
set => __pbn__Value = value;
}
public bool ShouldSerializeValue() => __pbn__Value != null;
public void ResetValue() => __pbn__Value = null;
private float? __pbn__Value;
[global::ProtoBuf.ProtoMember(3, Name = @"sample_val")]
[global::System.ComponentModel.DefaultValue("")]
public string SampleVal
{
get => __pbn__SampleVal ?? "";
set => __pbn__SampleVal = value;
}
public bool ShouldSerializeSampleVal() => __pbn__SampleVal != null;
public void ResetSampleVal() => __pbn__SampleVal = null;
private string __pbn__SampleVal;
}
public static partial class Extensions
{
public static string GetsampleValue(this global::Google.Protobuf.Reflection.FieldOptions obj)
=> obj == null ? default : global::ProtoBuf.Extensible.GetValue<string>(obj, 50004);
public static void SetsampleValue(this global::Google.Protobuf.Reflection.FieldOptions obj, string value)
=> global::ProtoBuf.Extensible.AppendValue<string>(obj, 50004, value);
}
}
#pragma warning restore CS0612, CS0618, CS1591, CS3021, IDE0079, IDE1006, RCS1036, RCS1057, RCS1085, RCS1192
#endregion
生成的 'myproto.cs' 中两种方法的静态 class Extensions
均发生错误。是不是可以只使用 protobuf-net 包而不使用任何额外的 Google 包?如果不是,那么我必须添加哪个包作为附加依赖项?我可能遗漏了一些微不足道的东西,但我现在似乎无法理解。
这里不需要Google引用;您有 extended FieldOptions
,这是与字段相关的 描述符元数据类型 。 protobuf-net 在 protobuf-net.Reflection 包中有一个实现,正是在预期的位置:Google.Protobuf.Reflection.FieldOptions
.
但是!我怀疑这是否会达到您的预期。在这种情况下,您已经定义了一个“自定义选项”。自定义选项 与运行时实例数据无关 - 它们是 .proto DSL 的一部分,通常用于 影响代码生成 ;在你的情况下,它会是这样的:
optional string sample_val = 3 [sampleValue= "ExtensionTypeName"];
(或类似的东西)
这里的要点是 value ("ExtensionTypeName"
) 仅在谈论 schema 字段 时适用,即为什么它悬挂在 FieldOptions
之外(代表模式字段定义的 实例 )。它与您在运行时使用 TestMessage
没有任何关系。此外:protobuf-net 目前没有将自定义选项打包到生成的 C# 中(它可以做,大概是作为属性中的 base-64 块,或类似的 - 它目前没有).
因此:退一步说:您的扩展 sampleValue
对您有何意义,您认为它与哪些实例相关?