우리 WPF 애플 리케이션에서 입력 유효성 검사가 있습니다. 입력 값 중 하나는 십진수이며 최대 값은입니다. 한 번 더 9 그리고 그것은 유효성 오류 피드백을 제공하지만 28 9의 의도대로 작동합니다.ParseBigInteger FormatException RavenDB 소스 코드에서
그러나 RavenDB에 저장하려고하면 BigIntegerParse가 FormatException
이고 이유를 알 수 없습니다. BigInteger의 크기가 거의 무한하다고 생각했습니다. (확실하지는 않지만 실수로 바이트 길이가 Integer.MAX_VALUE
과 같습니다). 그래도 BigInteger Parse가 28 9가있는 문자열을 BigInteger로 변환하는 데 문제가 없다고 가정합니다. 내가 처음 스택 트레이스 라인 (c:\Builds\RavenDB-Stable-3.0\Imports\Newtonsoft.Json\Src\Newtonsoft.Json\JsonTextReader.cs:line 1288
)의 소스 코드를보고 여기를 발견했습니다
System.FormatException: The value could not be parsed.
at System.Numerics.BigNumber.ParseBigInteger(String value, NumberStyles style, NumberFormatInfo info)
at Raven.Imports.Newtonsoft.Json.JsonTextReader.ParseNumber() in c:\Builds\RavenDB-Stable-3.0\Imports\Newtonsoft.Json\Src\Newtonsoft.Json\JsonTextReader.cs:line 1288
at Raven.Imports.Newtonsoft.Json.JsonTextReader.ParseValue() in c:\Builds\RavenDB-Stable-3.0\Imports\Newtonsoft.Json\Src\Newtonsoft.Json\JsonTextReader.cs:line 1010
at Raven.Imports.Newtonsoft.Json.JsonTextReader.ReadInternal() in c:\Builds\RavenDB-Stable-3.0\Imports\Newtonsoft.Json\Src\Newtonsoft.Json\JsonTextReader.cs:line 383
at Raven.Imports.Newtonsoft.Json.JsonTextReader.Read() in c:\Builds\RavenDB-Stable-3.0\Imports\Newtonsoft.Json\Src\Newtonsoft.Json\JsonTextReader.cs:line 304
at Raven.Json.Linq.RavenJObject.Load(JsonReader reader) in c:\Builds\RavenDB-Stable-3.0\Raven.Abstractions\Json\Linq\RavenJObject.cs:line 251
at Raven.Json.Linq.RavenJObject.Load(JsonReader reader) in c:\Builds\RavenDB-Stable-3.0\Raven.Abstractions\Json\Linq\RavenJObject.cs:line 211
at Raven.Json.Linq.RavenJObject.Load(JsonReader reader) in c:\Builds\RavenDB-Stable-3.0\Raven.Abstractions\Json\Linq\RavenJObject.cs:line 211
at Raven.Json.Linq.RavenJArray.Load(JsonReader reader) in c:\Builds\RavenDB-Stable-3.0\Raven.Abstractions\Json\Linq\RavenJArray.cs:line 139
...
는 스택 트레이스의 일부입니다.
라인 1288은 다음과 같은 코드가 있습니다 :
1284 else if (parseResult == ParseResult.Overflow)
1285 {
1286 #if !(NET20 || NET35 || SILVERLIGHT || PORTABLE40 || PORTABLE)
1287 string number = _stringReference.ToString();
{1288} numberValue = BigInteger.Parse(number, CultureInfo.InvariantCulture);
1289 numberType = JsonToken.Integer;
1290 #else
1291 // todo - validate number was a valid integer to make sure overflow was the reason for failure
1292 throw JsonReaderException.Create(this, "JSON integer {0} is too large or small for an Int64.".FormatWith(CultureInfo.InvariantCulture, _stringReference.ToString()));
1293 #endif
1294 }
그래서, 내 질문이 파서는 RavenDB 소스 코드에 저장할 수있는 최대 값은 무엇입니까? 최대 값을 알고 있다면 유효성 검사 클래스를 조정하여 기본 십진수의 max 대신 max로 설정할 수 있습니다. (우리는 RavenDB를 사용하여 Event-states를 저장하고 프로젝트는 CQRS 아키텍처를 사용합니다.)
'parseResult'는 분명히 게시 한 세그먼트의 소스 코드 어딘가에서 온 것입니다. 그것의 기원으로 되돌아가? –
@ J.Steen 어쩌면 꽤 분명하지만 어쩌면? 나는 RavenDB의 소스 코드를 디버깅 할 수 없으며 1288 행은 꽤 솔직하게 보인다. 'BigInteger.Parse'로 문자열을 구문 분석하지만 FormatException을 제공합니다. 아니면 그 길을 따라 소스 코드에서 문자열이 변경되었을 수도 있다는 뜻입니까? (더 이상 구문 분석의 시점에서 289가 아닙니다.) (이 행 1288은 오류의 가장 깊은 곳으로, 꼭대기가 아닙니다.) –
'parseResult'는 어딘가에서 왔다고 말했지만, 분명하지 않다고 말했습니다. ;)'BigInteger.Parse'는 실제 유효성 검사가 아니며 아마 여러분을 쫓아 버릴 것입니다. 유효성 검사는 이미 완료되었으며'parseResult' 변수는 코드의 이전 위치에서 그 유효성 검사 결과입니다. –