Skip to content

Commit a33ea98

Browse files
authored
STJ: Fix deserialization of UInt16 properties (#56793)
Fix #56792
1 parent f598846 commit a33ea98

File tree

8 files changed

+87
-1
lines changed

8 files changed

+87
-1
lines changed

src/libraries/System.Text.Json/gen/JsonSourceGenerator.Parser.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1051,7 +1051,7 @@ private void PopulateNumberTypes()
10511051
_numberTypes.Add(ResolveType(SpecialType.System_Int32));
10521052
_numberTypes.Add(ResolveType(SpecialType.System_Int64));
10531053
_numberTypes.Add(ResolveType(SpecialType.System_Single));
1054-
_numberTypes.Add(ResolveType(SpecialType.System_UInt64));
1054+
_numberTypes.Add(ResolveType(SpecialType.System_UInt16));
10551055
_numberTypes.Add(ResolveType(SpecialType.System_UInt32));
10561056
_numberTypes.Add(ResolveType(SpecialType.System_UInt64));
10571057
}

src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/ContextClasses.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace System.Text.Json.SourceGeneration.Tests
1010
public interface ITestContext
1111
{
1212
public JsonTypeInfo<Location> Location { get; }
13+
public JsonTypeInfo<NumberTypes> NumberTypes { get; }
1314
public JsonTypeInfo<RepeatedTypes.Location> RepeatedLocation { get; }
1415
public JsonTypeInfo<ActiveOrUpcomingEvent> ActiveOrUpcomingEvent { get; }
1516
public JsonTypeInfo<CampaignSummaryViewModel> CampaignSummaryViewModel { get; }

src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/MetadataAndSerializationContextTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace System.Text.Json.SourceGeneration.Tests
88
{
99
[JsonSerializable(typeof(Location))]
1010
[JsonSerializable(typeof(RepeatedTypes.Location), TypeInfoPropertyName = "RepeatedLocation")]
11+
[JsonSerializable(typeof(NumberTypes))]
1112
[JsonSerializable(typeof(ActiveOrUpcomingEvent))]
1213
[JsonSerializable(typeof(CampaignSummaryViewModel))]
1314
[JsonSerializable(typeof(IndexViewModel))]
@@ -38,6 +39,7 @@ public sealed class MetadataAndSerializationContextTests : RealWorldContextTests
3839
public override void EnsureFastPathGeneratedAsExpected()
3940
{
4041
Assert.NotNull(MetadataAndSerializationContext.Default.Location.Serialize);
42+
Assert.NotNull(MetadataAndSerializationContext.Default.NumberTypes.Serialize);
4143
Assert.NotNull(MetadataAndSerializationContext.Default.RepeatedLocation.Serialize);
4244
Assert.NotNull(MetadataAndSerializationContext.Default.ActiveOrUpcomingEvent.Serialize);
4345
Assert.NotNull(MetadataAndSerializationContext.Default.CampaignSummaryViewModel.Serialize);

src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/MetadataContextTests.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace System.Text.Json.SourceGeneration.Tests
88
{
99
[JsonSerializable(typeof(Location), GenerationMode = JsonSourceGenerationMode.Metadata)]
1010
[JsonSerializable(typeof(RepeatedTypes.Location), TypeInfoPropertyName = "RepeatedLocation", GenerationMode = JsonSourceGenerationMode.Metadata)]
11+
[JsonSerializable(typeof(NumberTypes), GenerationMode = JsonSourceGenerationMode.Metadata)]
1112
[JsonSerializable(typeof(ActiveOrUpcomingEvent), GenerationMode = JsonSourceGenerationMode.Metadata)]
1213
[JsonSerializable(typeof(CampaignSummaryViewModel), GenerationMode = JsonSourceGenerationMode.Metadata)]
1314
[JsonSerializable(typeof(IndexViewModel), GenerationMode = JsonSourceGenerationMode.Metadata)]
@@ -38,6 +39,7 @@ public override void EnsureFastPathGeneratedAsExpected()
3839
{
3940
Assert.Null(MetadataWithPerTypeAttributeContext.Default.Location.Serialize);
4041
Assert.Null(MetadataWithPerTypeAttributeContext.Default.RepeatedLocation.Serialize);
42+
Assert.Null(MetadataWithPerTypeAttributeContext.Default.NumberTypes.Serialize);
4143
Assert.Null(MetadataWithPerTypeAttributeContext.Default.ActiveOrUpcomingEvent.Serialize);
4244
Assert.Null(MetadataWithPerTypeAttributeContext.Default.CampaignSummaryViewModel.Serialize);
4345
Assert.Null(MetadataWithPerTypeAttributeContext.Default.IndexViewModel.Serialize);
@@ -59,6 +61,7 @@ public override void EnsureFastPathGeneratedAsExpected()
5961
[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata)]
6062
[JsonSerializable(typeof(Location))]
6163
[JsonSerializable(typeof(RepeatedTypes.Location), TypeInfoPropertyName = "RepeatedLocation")]
64+
[JsonSerializable(typeof(NumberTypes))]
6265
[JsonSerializable(typeof(ActiveOrUpcomingEvent))]
6366
[JsonSerializable(typeof(CampaignSummaryViewModel))]
6467
[JsonSerializable(typeof(IndexViewModel))]
@@ -89,6 +92,7 @@ public override void EnsureFastPathGeneratedAsExpected()
8992
{
9093
Assert.Null(MetadataContext.Default.Location.Serialize);
9194
Assert.Null(MetadataContext.Default.RepeatedLocation.Serialize);
95+
Assert.Null(MetadataContext.Default.NumberTypes.Serialize);
9296
Assert.Null(MetadataContext.Default.ActiveOrUpcomingEvent.Serialize);
9397
Assert.Null(MetadataContext.Default.CampaignSummaryViewModel.Serialize);
9498
Assert.Null(MetadataContext.Default.IndexViewModel.Serialize);

src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/MixedModeContextTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace System.Text.Json.SourceGeneration.Tests
88
{
99
[JsonSerializable(typeof(Location), GenerationMode = JsonSourceGenerationMode.Metadata)]
1010
[JsonSerializable(typeof(RepeatedTypes.Location), TypeInfoPropertyName = "RepeatedLocation", GenerationMode = JsonSourceGenerationMode.Serialization)]
11+
[JsonSerializable(typeof(NumberTypes), GenerationMode = JsonSourceGenerationMode.Metadata)]
1112
[JsonSerializable(typeof(ActiveOrUpcomingEvent), GenerationMode = JsonSourceGenerationMode.Metadata)]
1213
[JsonSerializable(typeof(CampaignSummaryViewModel), GenerationMode = JsonSourceGenerationMode.Serialization)]
1314
[JsonSerializable(typeof(IndexViewModel), GenerationMode = JsonSourceGenerationMode.Metadata)]
@@ -38,6 +39,7 @@ public override void EnsureFastPathGeneratedAsExpected()
3839
{
3940
Assert.Null(MixedModeContext.Default.Location.Serialize);
4041
Assert.NotNull(MixedModeContext.Default.RepeatedLocation.Serialize);
42+
Assert.Null(MixedModeContext.Default.NumberTypes.Serialize);
4143
Assert.NotNull(MixedModeContext.Default.CampaignSummaryViewModel.Serialize);
4244
Assert.Null(MixedModeContext.Default.IndexViewModel.Serialize);
4345
Assert.Null(MixedModeContext.Default.WeatherForecastWithPOCOs.Serialize);

src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/RealWorldContextTests.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,17 @@ public virtual void RoundTripLocation()
3333
VerifyLocation(expected, obj);
3434
}
3535

36+
[Fact]
37+
public virtual void RoundTripNumberTypes()
38+
{
39+
NumberTypes expected = CreateNumberTypes();
40+
41+
string json = JsonSerializer.Serialize(expected, DefaultContext.NumberTypes);
42+
NumberTypes obj = JsonSerializer.Deserialize(json, DefaultContext.NumberTypes);
43+
VerifyNumberTypes(expected, obj);
44+
}
45+
46+
3647
[Fact]
3748
public virtual void RoundTripIndexViewModel()
3849
{
@@ -127,6 +138,39 @@ protected static void VerifyLocation(Location expected, Location obj)
127138
Assert.Equal(expected.Country, obj.Country);
128139
}
129140

141+
protected static NumberTypes CreateNumberTypes()
142+
{
143+
return new NumberTypes
144+
{
145+
Single = 1.1f,
146+
Double = 2.2d,
147+
Decimal = 3.3m,
148+
SByte = -1,
149+
Byte = 1,
150+
UShort = 2,
151+
Short = -2,
152+
UInt = 3,
153+
Int = -3,
154+
ULong = 4,
155+
Long = -4,
156+
};
157+
}
158+
159+
protected static void VerifyNumberTypes(NumberTypes expected, NumberTypes obj)
160+
{
161+
Assert.Equal(expected.Single, obj.Single);
162+
Assert.Equal(expected.Double, obj.Double);
163+
Assert.Equal(expected.Decimal, obj.Decimal);
164+
Assert.Equal(expected.SByte, obj.SByte);
165+
Assert.Equal(expected.Byte, obj.Byte);
166+
Assert.Equal(expected.UShort, obj.UShort);
167+
Assert.Equal(expected.Short, obj.Short);
168+
Assert.Equal(expected.UInt, obj.UInt);
169+
Assert.Equal(expected.Int, obj.Int);
170+
Assert.Equal(expected.ULong, obj.ULong);
171+
Assert.Equal(expected.Long, obj.Long);
172+
}
173+
130174
protected static ActiveOrUpcomingEvent CreateActiveOrUpcomingEvent()
131175
{
132176
return new ActiveOrUpcomingEvent

src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/SerializationContextTests.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace System.Text.Json.SourceGeneration.Tests
99
[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Serialization)]
1010
[JsonSerializable(typeof(Location))]
1111
[JsonSerializable(typeof(RepeatedTypes.Location), TypeInfoPropertyName = "RepeatedLocation")]
12+
[JsonSerializable(typeof(NumberTypes))]
1213
[JsonSerializable(typeof(ActiveOrUpcomingEvent))]
1314
[JsonSerializable(typeof(CampaignSummaryViewModel))]
1415
[JsonSerializable(typeof(IndexViewModel))]
@@ -32,6 +33,7 @@ internal partial class SerializationContext : JsonSerializerContext, ITestContex
3233

3334
[JsonSerializable(typeof(Location), GenerationMode = JsonSourceGenerationMode.Serialization)]
3435
[JsonSerializable(typeof(RepeatedTypes.Location), GenerationMode = JsonSourceGenerationMode.Serialization, TypeInfoPropertyName = "RepeatedLocation")]
36+
[JsonSerializable(typeof(NumberTypes), GenerationMode = JsonSourceGenerationMode.Serialization)]
3537
[JsonSerializable(typeof(ActiveOrUpcomingEvent), GenerationMode = JsonSourceGenerationMode.Serialization)]
3638
[JsonSerializable(typeof(CampaignSummaryViewModel), GenerationMode = JsonSourceGenerationMode.Serialization)]
3739
[JsonSerializable(typeof(IndexViewModel), GenerationMode = JsonSourceGenerationMode.Serialization)]
@@ -56,6 +58,7 @@ internal partial class SerializationWithPerTypeAttributeContext : JsonSerializer
5658
[JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase)]
5759
[JsonSerializable(typeof(Location), GenerationMode = JsonSourceGenerationMode.Serialization)]
5860
[JsonSerializable(typeof(RepeatedTypes.Location), GenerationMode = JsonSourceGenerationMode.Serialization, TypeInfoPropertyName = "RepeatedLocation")]
61+
[JsonSerializable(typeof(NumberTypes), GenerationMode = JsonSourceGenerationMode.Serialization)]
5962
[JsonSerializable(typeof(ActiveOrUpcomingEvent), GenerationMode = JsonSourceGenerationMode.Serialization)]
6063
[JsonSerializable(typeof(CampaignSummaryViewModel), GenerationMode = JsonSourceGenerationMode.Serialization)]
6164
[JsonSerializable(typeof(IndexViewModel), GenerationMode = JsonSourceGenerationMode.Serialization)]
@@ -91,6 +94,7 @@ public override void EnsureFastPathGeneratedAsExpected()
9194
{
9295
Assert.NotNull(SerializationContext.Default.Location.Serialize);
9396
Assert.NotNull(SerializationContext.Default.RepeatedLocation.Serialize);
97+
Assert.NotNull(SerializationContext.Default.NumberTypes.Serialize);
9498
Assert.NotNull(SerializationContext.Default.ActiveOrUpcomingEvent.Serialize);
9599
Assert.NotNull(SerializationContext.Default.CampaignSummaryViewModel.Serialize);
96100
Assert.NotNull(SerializationContext.Default.IndexViewModel.Serialize);
@@ -124,6 +128,20 @@ public override void RoundTripLocation()
124128
AssertFastPathLogicCorrect(json, obj, DefaultContext.Location);
125129
}
126130

131+
[Fact]
132+
public override void RoundTripNumberTypes()
133+
{
134+
NumberTypes expected = CreateNumberTypes();
135+
136+
string json = JsonSerializer.Serialize(expected, DefaultContext.NumberTypes);
137+
JsonTestHelper.AssertThrows_PropMetadataInit(() => JsonSerializer.Deserialize(json, DefaultContext.NumberTypes), typeof(NumberTypes));
138+
139+
NumberTypes obj = JsonSerializer.Deserialize(json, ((ITestContext)MetadataWithPerTypeAttributeContext.Default).NumberTypes);
140+
VerifyNumberTypes(expected, obj);
141+
142+
AssertFastPathLogicCorrect(json, obj, DefaultContext.NumberTypes);
143+
}
144+
127145
[Fact]
128146
public override void RoundTripIndexViewModel()
129147
{

src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/TestClasses.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,21 @@ public class Location
3535
public string Country { get; set; }
3636
}
3737

38+
public class NumberTypes
39+
{
40+
public float Single { get; set; }
41+
public double Double { get; set; }
42+
public decimal Decimal { get; set; }
43+
public sbyte SByte { get; set; }
44+
public byte Byte { get; set; }
45+
public ushort UShort { get; set; }
46+
public short Short { get; set; }
47+
public uint UInt { get; set; }
48+
public int Int { get; set; }
49+
public ulong ULong { get; set; }
50+
public long Long { get; set; }
51+
}
52+
3853
public class ActiveOrUpcomingEvent
3954
{
4055
public int Id { get; set; }

0 commit comments

Comments
 (0)