gpt4 book ai didi

protocol-buffers - 使用 protobuf-net 生成类时解码自定义选项值

转载 作者:行者123 更新时间:2023-12-04 15:54:54 25 4
gpt4 key购买 nike

我正在使用 protogbuf-gen 转换 C# 类中的原型(prototype)文件。我想将原型(prototype)文件中的一些选项转换到我的类中的一些属性。所以我有一个带有如下选项的原型(prototype)文件:

syntax = "proto3";

import "google/protobuf/timestamp.proto";
import "google/protobuf/descriptor.proto";

enum LogOrder {
NONE = 0;
FIRST = 1;
SECOND = 2;
THIRD = 3;
}

extend google.protobuf.FieldOptions {
LogOrder shouldBeLogged = 50001;
}

message Person {
string id = 1 [(shouldBeLogged)=FIRST];
int32 business_id = 2 [(shouldBeLogged)=SECOND,deprecated=true];
...

为了尝试这样做,我必须编写自己的 CSharpCodeGenerator 子类,在其中我可以使用重载的 WriteField 中的属性来装饰字段。

public class ServiceCodeGenerator : CSharpCodeGenerator
{
protected override void WriteField(GeneratorContext ctx, FieldDescriptorProto obj, ref object state, OneOfStub[] oneOfs)
{
var bytes = obj.Options?.ExtensionData;
// if extension data == shouldBeLogged then write somee attribute with a value

base.WriteField(ctx, obj, ref state, oneOfs);
}
...

但是,我唯一能得到的是一个字节数组,它包含类似 [136, 181, 24, 1] 的内容,其中最后一个字节“1”似乎是“shouldBeLogged”的值。

我如何将这些字节转换为开发人员友好的内容,或者以其他方式访问选项及其值?

最佳答案

如果你通过 protogen 运行现有的 .proto,你应该在生成的代码中得到:

public static class Extensions
{
public static LogOrder GetshouldBeLogged(this global::Google.Protobuf.Reflection.FieldOptions obj)
=> obj == null ? default : global::ProtoBuf.Extensible.GetValue<LogOrder>(obj, 50001);

public static void SetshouldBeLogged(this global::Google.Protobuf.Reflection.FieldOptions obj, LogOrder value)
=> global::ProtoBuf.Extensible.AppendValue<LogOrder>(obj, 50001, value);

}

这意味着您可以使用:

var shouldBeLogged = obj.Options.GetshouldBeLogged();

关于protocol-buffers - 使用 protobuf-net 生成类时解码自定义选项值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52205325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com