Сериализация protobuf-net без атрибутов - программирование
Подтвердить что ты не робот

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

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

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

Не нравится атрибуты? В версии 2 все, что можно сделать с атрибутами, также можно настроить во время выполнения через 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 {
}
4b9b3361

Ответ 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.