«Проводное значение» представляет собой двоичное представление, которое оно будет использовать «на проводе», то есть в базовом потоке. В этом случае тот факт, что он использовал 0
, означает, что значение перечисления равно 0, но он не ожидал 0, в основном из-за того, что не указан элемент перечисления, который имеет значение, если 0. Если были бы, он использовал бы имя, а не System.Drawing.ContentAlignment.0
. protobuf-net пытается применять правила перечисления, которые обеспечивают соблюдение значений (а также необязательно позволяют определять карты между значениями перечисления и значениями проводов для некоторых сценариев с внешними данными)
Существуют различные способы избежать этого вопрос:
- не пытаются сериализации значения перечислений, которые не существуют (или: добавить недостающие значения, если вы контролируете перечисление)
- использование
Nullable<SomeEnum>
(SomeEnum?
) сериализовать перечисление, что не хватает None
значение, если вы хотите представить это
использовать свойство «прокладку», которая обнажает тип как int
(или любой другой основной тип), так что Protobuf-сеть никогда не пытается применить правила перечислений:
public SomeEnum Foo {get;set;} // the actual member
[ProtoMember(42)]
private int FooSerialized { // only exists to help protobuf-net ignore the
get { return (int)Foo; }// invalid values that the member might contain
set { Foo = (SomeEnum)value; }
}
вручную настроить модель с помощью RuntimeTypeModel
и сказать Protobuf-сеть игнорировать перечисление обработки для этого пользователя, установив EnumPassthru
в true
- маркировать объявление перечислимого с
[Flags]
, что сделает Protobuf-сеть позволит EnumPassThru
автоматически
«Позиция 16» *, возможно, говорит о смещении в выходной буфер; для * сериализации *, это, вероятно, помогает мне больше, чем вы; для * десериализации *, это может быть более полезным для потребителя –