이 코드는 문제를 재현합니다.
Type Resolver(int fieldNumber)
{
return typeof(ConsoleColor?);
}
var stream = new MemoryStream();
ConsoleColor? obj = ConsoleColor.Green;
Serializer.NonGeneric.SerializeWithLengthPrefix(stream, obj, PrefixStyle.Base128, 1);
stream.Position = 0;
Serializer.NonGeneric.TryDeserializeWithLengthPrefix(stream, PrefixStyle.Base128, Resolver, out var dd);
//EXCEPTION!!!
단순히 nullable 열거 형 값을 직렬화하고 있습니다. 그러나 역 직렬화를 시도하면 예외가 발생합니다.
ProtoBuf.ProtoException : 유효하지 않은 와이어 유형; 이것은 일반적으로 길이를 자르거나 설정하지 않고 파일을 덮어 썼음을 의미합니다.
https://stackoverflow.com/q/2152978/23354
' 참조
내가 도대체 뭘 잘못하고있는 겁니까? 문제를 해결하거나 해결할 수있는 방법이 있습니까? protobuf-net 라이브러리 2.4.6 버전을 사용하고 있습니다. (.Net Framework 4.0에 붙어 있기 때문에 3.x로 이동할 수 없습니다).
당신이 통과 할 때 Nullable<T>
취하는 API로 object
, 그것입니다 박스 와의 복싱 규칙은 Nullable<T>
특별하다 : 그것은 상자에 중 정기적으로 null
, 또는의 상자 T
가 아닌 상자 T?
; 즉, object
값 은 nullable 값 유형을 포함 하지 않습니다 . 이 때문에 라이브러리의 관점에서 a ConsoleColor
가 아닌 을 보냈습니다 ConsoleColor?
.
Type Resolver(int fieldNumber)
{
return typeof(ConsoleColor);
}
참고로 리졸버 API는 매우 구체적이고 틈새 시장이며 일반적으로 더 나은 방법이 있습니다. 달성 하려는 목표 를 말씀해 주시면 더 많은 안내를 드릴 수 있습니다.
(나는이 있는지 여부를 생각하기 위해 노력하고있어 지금까지 리졸버가 의미있게를 반환 할 수있는 시나리오 typeof(Nullable<T>)
일부는 T
- 우리가 할 수 아마도 단지 널 (NULL) 자체의 포장을 라이브러리가, 또는 더 의미있는 메시지를 올릴)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다