как добавить необязательное поле в класс вручную в protobuf-net - PullRequest
4 голосов
/ 17 июня 2011

В моем .proto у меня есть несколько сообщений с необязательными полями.Для Debian не существует нативных протогенов, поэтому мне не с чем поэкспериментировать (слишком ленив, чтобы скомпилировать их самостоятельно:).

Не могли бы вы рассказать, как реализовать необязательное поле в классе в C #?Я хотел бы иметь функцию или что-то, что идентифицирует поле установлено (в C ++ у меня есть что-то вроде hasfoo ()).В примерах, которые я нашел в интернете, ничего подобного нет.

1 Ответ

5 голосов
/ 17 июня 2011

Здесь поддерживается ряд шаблонов, чтобы помочь переходу от других сериализаторов.И обратите внимание, что в protobuf-net protogen есть опции для автоматического включения таких членов для вас.

Во-первых, все, что null опущено;это включает в себя как null ссылки, так и Nullable<T> для структур.Итак:

[ProtoMember(1)]
public int? A {get;set;}

будет вести себя.

Другой вариант - значения по умолчанию;используя соглашения .NET:

[ProtoMember(2), DefaultValue(17)]
public int B {get;set;}

никакие значения 17 не будут сериализованы.

Для более явного управления, шаблон ShouldSerialize* (из XmlSerializer) и шаблон *Specified(от DataContractSerializer), поэтому вы можете сделать:

[ProtoMember(3)]
public string C {get;set;}

public bool ShouldSerializeC() { /* return true to serialize */ }

и

[ProtoMember(4)]
public string D {get;set;}

public bool DSpecified {get;set;} /* return true to serialize */

Они могут быть общедоступными или частными (если вы не генерируете отдельную сборку сериализации, котораятребуется public).

Если ваши основные классы происходят из code-gen, то partial class является идеальной точкой расширения, то есть

partial class SomeType {
    /* extra stuff here */
}

, поскольку вы можете добавить это в отдельномфайл кода.

...