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.