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() {}
}
добавить дополнительный атрибут и явный конструктор.