Protobuf-net sérial enum avec la valeur hors de scope

C # permet d’affecter une valeur entière à enum.

Lorsque j’essaie de sérialiser (via protobuf-net) un object avec un champ enum dont la valeur est hors limites, il génère une exception: aucune valeur filaire n’est mappée sur l’énumération PersonLevel.

Mon énumération PersonLevel ne possède pas d’atsortingbut Flags.

[ProtoContract(ImplicitFields = ImplicitFields.AllFields)] public enum PersonLevel { Unknown = 1 } [ProtoContract(ImplicitFields = ImplicitFields.AllFields)] public class Person { ... public PersonLevel PersonLevel { get; set; } ... } 
 var ms = new MemoryStream(); var person = new Person { ... PersonLevel = (PersonLevel) 500 ... }; Serializer.Serialize(ms, person); //No wire-value is mapped to the enum PersonLevel 

Y a-t-il des installations pour le faire sans changer d’object métier (peut-être des protobuf d’attrubutes)?

Il y a plusieurs façons de le dire pour simplifier les règles; comme le note Ravadre, [Flags] désactive automatiquement la validation – cela provoque le EnumPassthru d’ EnumPassthru . Vous pouvez également le faire manuellement, à condition que vous le fassiez avant de commencer à sérialiser / désérialiser:

 RuntimeTypeModel.Default[typeof(PersonLevel)].EnumPassthru = true; 

qui a la description:

 ///  /// Gets or sets a value indicating that an enum should be treated directly as an int/short/etc, rather /// than enforcing .proto enum rules. This is useful *in particular* for [Flags] enums. ///  

Ce que vous pouvez faire est de créer un champ int que vous allez incorporer dans un message protobuf et exposer une propriété, qui exposera votre champ int comme une enum de votre type (étant un wrapper).

Cela pourrait être plus difficile si vous utilisez des champs implicites, car protobuf tentera probablement de sérialiser à la fois votre propriété entière et votre propriété enum . Vous pouvez essayer explicitement [ProtoIgnore] votre propriété enum .

Cependant, protobuf le fait automatiquement pour vous si votre enum est marqué avec l’atsortingbut [Flags] . Par conséquent, changez votre enum en:

 [ProtoContract(ImplicitFields = ImplicitFields.AllFields)] [Flags] public enum PersonLevel { Unknown = 1 } 

devrait le faire fonctionner. Au moins dans la version 2.