protobuf-net для сериализации без атрибутов

у меня есть сборка с DataContracts и мне нужно сгенерировать .схема proto для него, чтобы иметь возможность обмениваться данными с системой java. Код DataContracts можно изменить, но я не могу добавить [ProtoContract] и [ProtoMember] атрибуты в нем, потому что это приведет к зависимости сборки protobuf-net. Мы используем WCF в частях C# системы, поэтому мы не хотели бы иметь зависимость от сборки proto-buf в большинстве проектов C#, которые не работают с системой java.

на сайте protobuf-net в а GettingStarted в разделе сказано, что:

не нравится атрибуты?
В v2 все, что можно сделать с атрибутами, также можно настроить во время выполнения через RuntimeTypeModel.

однако я понятия не имею, как настроить сериализацию без атрибутов, и я не видел никаких примеров этого.

Я пытаюсь сделать

[DataContract]
public class MyEntity
{
    [DataMember(Order = 1)]
    public String PropertyA { get; set; }

    [DataMember(Order = 2)]
    public int PropertyB { get; set; }
}

RuntimeTypeModel.Default.Add(typeof(MyEntity), false);

string proto = Serializer.GetProto<MyEntity>();

и получить следующее значение proto

package ProtobufTest;

message MyEntity {
}

1 ответов


уточнение: большая часть этого ответа относится к вопросу предварительного редактирования, где false была передана RuntimeTypeModel.Add(...)


я использовал ваш точный код (я сделал вывод, что это было в namespace ProtobufTest, но остальное было копировать / вставлять из вопроса) с r2.0.0.640 (текущее развертывание NuGet), и я получаю:

package ProtobufTest;

message MyEntity {
   optional string PropertyA = 1;
   optional int32 PropertyB = 2 [default = 0];
}

Далее, вы получаете точно тот же результат, даже если вы удалите RuntimeTypeModel.Default.Add(...) линии.

мне непонятно, почему вы видя что-то другое - можете уточнить:

  • какую версию protobuf-net вы используете ровно
  • если эти [DataContract] / [DataMember] атрибуты System.Runtime.Serialization.dll один или ваш собственный (извините, если это кажется странным вопросом)

чтобы ответить на вопрос полностью: если у вас не может быть никаких атрибутов (и те, которые у вас есть, просто отлично), вы также можете сделать:

RuntimeTypeModel.Default.Add(typeof(MyEntity), false)
    .Add(1, "PropertyA")
    .Add(2, "PropertyB");

что бы настроить PropertyA в качестве ключа 1, и PropertyB как ключ 2.