2016-06-14 8 views
2

Was bedeutet: "No Wire-Wert ist auf die enum foo Position 16 gemappt" Fehler bedeuten?

"Kein Draht-Wert wird auf die Enum foo Position 16 abgebildet" Was bedeutet diese Fehlermeldung bedeutet?

  • i.) Was ist ein Drahtwert?

  • ii.) Um welche Position handelt es sich?

In meinem speziellen Situation, die ich habe:

Zusätzliche Informationen: Kein Draht-Wert der Enum System.Drawing.ContentAlignment.0 an Position 16 abgebildet wird

Es gibt keine Darstellung in der Enumeration für die ganze Zahl 0, die ich kenne. Ich denke, wenn ich nur weiß, was der Fehlerbericht bedeutet, werde ich mir eine bessere Vorstellung davon machen, wie ich dieses Problem lösen kann.

+0

Die "Position 16" spricht * wahrscheinlich * über Offset in den Ausgangspuffer; für * Serialisierung *, es hilft mir wahrscheinlich mehr als du; Für * Deserialisierung * kann es für den Verbraucher nützlicher sein –

Antwort

3

Ein "Draht-Wert" ist die binäre Darstellung, die es "auf dem Draht" verwenden wird, d. H. In dem zugrunde liegenden Strom. In diesem Fall bedeutet die Tatsache, dass 0 verwendet wurde, dass der Wert der Enumeration 0 ist, aber dass keine 0 erwartet hat, wahrscheinlich weil kein enum-Member definiert ist, das den Wert if 0 hat Wäre, hätte es den Namen verwendet, nicht System.Drawing.ContentAlignment.0. protobuf-net versucht, Enumerationsregeln anzuwenden, die die Bedeutung der Werte erzwingen (und optional auch die Definition von Maps zwischen Enumerationswerten und Drahtwerten zulassen).

Es gibt verschiedene Möglichkeiten, dies zu vermeiden Frage:

  • nicht versuchen, enum-Werte serialisiert werden, die nicht existieren (oder: die fehlenden Werte hinzufügen, wenn Sie die enum-Steuerung)
  • Verwendung Nullable<SomeEnum> (SomeEnum?) eine eNUM serialisiert werden, die ein fehlt None Wert, wenn Sie das darstellen möchten
  • eine „Scheibe“ Eigenschaft, die den Typ als int aussetzt (oder was auch immer der zugrunde liegende Typ ist), so dass protobuf-net nie Enum Regeln versucht anzuwenden:

    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; } 
    } 
    
  • manuell das Modell über RuntimeTypeModel konfigurieren und sagen protobuf-net enum zu ignorieren für diesen Benutzer Handhabung von EnumPassthru Einstellung true

  • mit [Flags] die enum-Deklaration markieren, die protobuf-net ermöglichen EnumPassThru automatisch
machen