Skip to content

Commit fa45a83

Browse files
authored
Handle OverflowException when converting an VR IS to an integer (#3365)
Handle overflow error by saving the value as string
1 parent c72aa5c commit fa45a83

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

forks/Microsoft.Health.FellowOakDicom/Serialization/JsonDicomConverter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ private void WriteJsonAsNumberOrString(Utf8JsonWriter writer, DicomElement elem,
448448
{
449449
numberWriterAction();
450450
}
451-
catch (FormatException)
451+
catch (Exception ex) when (ex is FormatException || ex is OverflowException)
452452
{
453453
if (_numberSerializationMode == NumberSerializationMode.PreferablyAsNumber)
454454
{

src/Microsoft.Health.Dicom.Core.UnitTests/Serialization/JsonDicomConverterExtendedTests.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55

66
using System;
77
using System.Linq;
8+
using System.Text;
89
using System.Text.Json;
910
using FellowOakDicom;
11+
using FellowOakDicom.IO.Buffer;
1012
using Microsoft.Health.FellowOakDicom.Serialization;
1113
using Xunit;
1214

@@ -302,4 +304,28 @@ public static void GivenDicomJsonDatasetWithInvalidPrivateCreatorDataElement_Whe
302304
DicomDataset ds = JsonSerializer.Deserialize<DicomDataset>(json, SerializerOptions);
303305
Assert.NotNull(ds);
304306
}
307+
308+
[Theory]
309+
[InlineData("2147384638123")]
310+
[InlineData("73.8")]
311+
[InlineData("InvalidNumber")]
312+
public static void GivenDatasetWithInvalidOrOverflowNumberForValueRepresentationIS_WhenSerialized_IsDeserializedCorrectly(string overflowNumber)
313+
{
314+
var dicomDataset = new DicomDataset().NotValidated();
315+
dicomDataset.Add(new DicomIntegerString(DicomTag.Exposure, new MemoryByteBuffer(Encoding.ASCII.GetBytes(overflowNumber))));
316+
317+
var serializerOptions = new JsonSerializerOptions
318+
{
319+
Converters =
320+
{
321+
new DicomJsonConverter(autoValidate: false, numberSerializationMode: NumberSerializationMode.PreferablyAsNumber)
322+
}
323+
};
324+
325+
var json = JsonSerializer.Serialize(dicomDataset, serializerOptions);
326+
JsonDocument.Parse(json);
327+
DicomDataset deserializedDataset = JsonSerializer.Deserialize<DicomDataset>(json, serializerOptions);
328+
var recoveredString = deserializedDataset.GetValue<string>(DicomTag.Exposure, 0);
329+
Assert.Equal(overflowNumber, recoveredString);
330+
}
305331
}

0 commit comments

Comments
 (0)