2016-06-14 2 views
2

«Нет проволоки значение не отображается в позиции Foo перечислений 16»Что означает: «Никакое значение проводника не отображается на ошибку enum foo position 16»?

Что это сообщение об ошибке означает?

  • i.) Что такое проводная стоимость?

  • ii.) Какова позиция относительно?

В моей конкретной ситуации у меня есть:

Дополнительная информация: Нет проводная значение не отображается на перечислений System.Drawing.ContentAlignment.0 в положении 16

Eсть нет представления в перечислении для целого числа 0, которое я знаю. Я думаю, что просто знание того, что означает сообщение об ошибке, даст мне лучшее представление о том, как решить эту проблему.

+0

«Позиция 16» *, возможно, говорит о смещении в выходной буфер; для * сериализации *, это, вероятно, помогает мне больше, чем вы; для * десериализации *, это может быть более полезным для потребителя –

ответ

3

«Проводное значение» представляет собой двоичное представление, которое оно будет использовать «на проводе», то есть в базовом потоке. В этом случае тот факт, что он использовал 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 автоматически
Смежные вопросы