2016-04-12 3 views
0

Я начинаю работать с protobufs - У меня есть прото файл:protobuf и .net - как я могу использовать сгенерированный файл .cs?

syntax = "proto2"; 

message InputState { 
    required uint32 input = 1; 
    required string state = 2; 
} 

message InputStateData { 
    repeated InputState input = 1; 
} 

Я побежал инструмент командной строки (из protoc-3.0.0-альфа-3-win32)

я получил этот неожиданный .cs файл: !click me! Input.cs

Я включил NuGet Protobuf переносной-сеть, но теперь я не имею ни малейшего представления о том, как использовать сгенерированный файл .cs

Что делать дальше - это Input. cs файл правильный?

+0

Добавьте файл в свой '.csproj' и используйте его. – Dai

+0

@Dai Проверьте Input.cs, файл не может использоваться в C# из того, что я вижу – pogorman

+0

Что заставляет вас думать, что это непригодно? Мне это хорошо. – Dai

ответ

1

Есть два полностью отдельных инструмента (по крайней мере) в .net, которые говорят «protobuf». Похоже, вы используете инструмент от одного (версия Джона, которая раньше была «protobuf-csharp-port», но которая теперь является частью кодовой базы IIRC), но используя библиотеку от другого (protobuf -сеть). Это не сработает! Инструментарий библиотеки должен совпадать.

Если вы хотите использовать protobuf-net: либо используйте библиотеку protobuf-net самостоятельно (она поддерживает «код в первую очередь», то есть: нет инструментария), или используйте инструмент protobuf-net с библиотекой protobuf-net.

Если вы хотите использовать protobuf-csharp-port (который теперь может быть просто protobuf): используйте инструмент из этого и библиотеку.

Для получения информации, для кода, первый подход с Protobuf-сети, вы можете перевести простые контракты вручную, если вы не хотите, чтобы использовать этапы сборки:

[ProtoContract] 
class InputState { 
    [ProtoMember(1)] 
    public uint Input {get;set;} 
    [ProtoMember(2)] 
    public string State {get;set;} 
} 
[ProtoContract] 
class InputStateData { 
    [ProtoMember(1)] 
    public List<InputState> Input {get;} = new List<InputState>(); 
} 
+0

спасибо! Я надеялся, что вы дадите свой вклад. Пример, который вы публикуете, - это то, что я ожидал от генераторов. Существуют ли генераторы, которые могут это сделать? Кроме того, почему инструмент protoc создает такой сложный файл? – pogorman

+0

@pogorman инструмент 'protogen' в protobuf-net выводит что-то подобное; что касается «почему»: так как protoc предназначен для работы –

+0

Я хочу общаться со встроенной системой (программное обеспечение, написанное на C). Структуры, которые будут переданы, всегда будут определены на встроенной стороне. Мы будем использовать нанопб на встроенной стороне. Я надеялся использовать прото-файлы из встроенных и генерировать классы, как вы выше. Возможно ли это? Или я должен просто пойти со стандартным инструментом protoc? Как вы думаете, как использовать генератор файлов bests C#? Еще раз спасибо. – pogorman

0

Ok - Я учусь больше, это генератор файлов, который дает формат, наиболее близкий к тому, что я ожидал: https://github.com/floatinghotpot/protogen (для использования с protobuf-net). Это именно то, что мне нужно.

//------------------------------------------------------------------------------ 
// <auto-generated> 
//  This code was generated by a tool. 
// 
//  Changes to this file may cause incorrect behavior and will be lost if 
//  the code is regenerated. 
// </auto-generated> 
    //------------------------------------------------------------------------------ 

// Generated from: inputs.proto 
namespace inputs 
{ 
[global::System.Serializable, global::ProtoBuf.ProtoContract([email protected]"InputState")] 
public partial class InputState : global::ProtoBuf.IExtensible 
{ 
public InputState() {} 

private uint _input; 
[global::ProtoBuf.ProtoMember(1, IsRequired = true, [email protected]"input", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)] 
public uint input 
{ 
    get { return _input; } 
    set { _input = value; } 
} 
private string _state; 
[global::ProtoBuf.ProtoMember(2, IsRequired = true, [email protected]"state", DataFormat = global::ProtoBuf.DataFormat.Default)] 
public string state 
{ 
    get { return _state; } 
    set { _state = value; } 
} 
private global::ProtoBuf.IExtension extensionObject; 
global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) 
    { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); } 
} 

[global::System.Serializable, global::ProtoBuf.ProtoContract([email protected]"InputStateData")] 
public partial class InputStateData : global::ProtoBuf.IExtensible 
{ 
public InputStateData() {} 

private readonly global::System.Collections.Generic.List<InputState> _input = new global::System.Collections.Generic.List<InputState>(); 
[global::ProtoBuf.ProtoMember(1, [email protected]"input", DataFormat = global::ProtoBuf.DataFormat.Default)] 
public global::System.Collections.Generic.List<InputState> input 
{ 
    get { return _input; } 
} 

private global::ProtoBuf.IExtension extensionObject; 
global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) 
    { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); } 
} 

} 
Смежные вопросы