2013-03-01 2 views
2

C#에서는 열거 형에 정수 값을 할당 할 수 있습니다.Protobuf-net은 값이 범위를 벗어난 열거 형을 직렬화합니다.

값이 범위를 벗어난 열거 형 필드를 사용하여 (protobuf-net을 통해) 직렬화하려고하면 예외가 발생합니다. 열거 형 값이 열거 형 PersonLevel에 매핑되지 않습니다.

내 열거 형 PersonLevel에는 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 

비즈니스 오브젝트 (아마도 어떤 protobuf의 attrubutes)을 변경하지 않고 그것을 할 수있는 시설이 있나요?

답변

6

규칙을 단순화하기 위해 몇 가지 방법이 있습니다. Ravadre가 말한 것처럼 [Flags]은 자동으로 유효성 검사를 비활성화합니다. 따라서 EnumPassthru이 토글됩니다. 또한 수동으로이 작업을 수행 할 수 있습니다 - 한 당신이 직렬화 시작 전에/역 직렬화 같이 :

마르신-deputala @
/// <summary> 
/// 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. 
/// </summary> 
2

은 무엇 당신이 할 수있는 것은 당신이 protobuf 메시지로 팩과 유형의 enum이 (래퍼 인)로 int 필드를 표시하는 속성을 노출 것 int 필드를 만들 수 있습니다.

protobuf가 정수와 enum 속성을 모두 직렬화하려고하기 때문에 암시 적 필드를 사용하는 경우이 작업이 어려울 수 있습니다. enum 속성을 명시 적으로 [ProtoIgnore] 시도 할 수 있습니다. 그것이 작동되도록해야

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

: 당신의 열거가 너무에 열거 변경, [Flags] 속성으로 표시되는 경우

그러나, protobuf는 자동으로이 작업을 수행합니다. 버전 2 이상.

+0

당신은을 사용하여 조심해야 설명이 있습니다

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

알 수없는 enum 값. 둘 이상의 열거 형에서이 열거 형을 두 개 이상 사용하면 동일한 클래스에서 열거 형 중 두 개 이상을 사용하면 다음과 같은 오류가 표시됩니다. MyClass.proto : 67 : 4 : "Unknown"이 이미 정의되어 있습니다. MyClass.proto : 67 : 4 : enum 값은 C++ 범위 지정 규칙을 사용합니다. 즉, 열거 형 값은 해당 형식의 형제이며 자식은 아닙니다. 따라서 "Unknown"은 "PersonLevel"내에서만이 아니라 전역 범위 내에서 고유해야합니다. 현재이 패턴을 광범위하게 사용하는 대규모 레거시 코드 기반에 대해 어떻게 할 수 있는지 파악하려고합니다. –

+0

아마도 문자열로 열거 형을 처리하도록 protobuf-net에 알릴 수 있습니까? @ marc-gravell은 아마도 그것을 알게 될 것입니다. 아니면 다른 해결책을 제안 할 수 있습니다. –