protobuf-Net - аргументы командной строки Protogen

Я пытаюсь сгенерировать файл csharp (.cs) из файла.proto. Я загрузил protobuf-net с github и собрал локально, чтобы я мог использовать protogen для генерации.cs файлов. Моя проблема заключается в том, что я хочу, чтобы он был в том формате, в котором были сгенерированы выходные данные предыдущих версий этого API, поэтому, например, вновь созданные классы не наследуются от ProtoBuf.IExtensible, тогда как предыдущие версии наследовали от ProtoBuf.IExtensible. Например, протоген генерирует:

[global::ProtoBuf.ProtoContract()]
    public partial class ClientMsg
    {
        [global::ProtoBuf.ProtoMember(100)]
        public Logon logon { get; set; }
        ...
    } 

где то, что я хотел бы что-то вроде:

    [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"ClientMsg")]
    public partial class ClientMsg : global::ProtoBuf.IExtensible
    {
        public ClientMsg() {}


        private WebAPI_1.Logon _logon = null;
        [global::ProtoBuf.ProtoMember(100, IsRequired = false, Name=@"logon", DataFormat = global::ProtoBuf.DataFormat.Default)]
        [global::System.ComponentModel.DefaultValue(null)]
        public WebAPI_1.Logon logon
        {
          get { return _logon; }
          set { _logon = value; }
        }
...
}

1 ответ

Решение

Во-первых: обратите внимание, что протоген доступен для скачивания здесь.

Сейчас; ре IExtensible: это было на самом деле преднамеренно и должно было соответствовать исходному поведению Google v3. *, когда неизвестные поля больше не сохраняются (поведение v2. *). Однако теперь это поведение снова изменилось - начиная с protobuf v3.5.0 (13 ноября 2017 г.) кода Google: неизвестные поля снова сохраняются. Мне просто нужно обновить протоген с этим фактом. Если это важно для вас, я, вероятно, могу сделать это довольно быстро - это просто означает удаление if тесты в CSharpCodeGenerator строки 217 и 224.

В теории вы также можете просто наследовать от CSharpCodeGenerator в вашем собственном коде, но API для использования собственного генератора сейчас не тривиален.

В командной строке нет опции для выдачи точно такого же кода, как в предыдущей версии, и я не собираюсь добавлять ее. Существует переключатель для переключения версии языка C# (для использования C# более низкого уровня): например, +langver=3 в командной строке, или он может быть встроен в.proto:

import "protobuf-net/protogen.proto";
option (.protobuf_net.fileopt).csharp_langver = "3";

Обратите внимание, что, поскольку это partial class Вы также можете добавить дополнительный код в отдельный файл кода без редактирования сгенерированного кода. Например, в вашем собственном файле.cs вы можете иметь:

[Serializable]
partial class ClientMsg {
    public ClientMsg() {}
}

добавить дополнительный атрибут и явный конструктор.

Другие вопросы по тегам