Skip to content

Commit fbe8c43

Browse files
committed
Support complex properties
1 parent 61e6dc7 commit fbe8c43

4 files changed

Lines changed: 74 additions & 3 deletions

File tree

src/System.Text.Json.Protobuf/ProtobufConverter.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public ProtobufConverter()
2121
{
2222
Accessor = fieldDescriptor.Accessor,
2323
IsRepeated = fieldDescriptor.IsRepeated,
24-
FieldType = GetFieldType(fieldDescriptor.FieldType),
24+
FieldType = GetFieldType(fieldDescriptor),
2525
JsonName = fieldDescriptor.JsonName,
2626
};
2727
_fieldsLookup.Add(fieldDescriptor.JsonName, fieldInfo);
@@ -90,9 +90,9 @@ public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOption
9090
writer.WriteEndObject();
9191
}
9292

93-
private Type GetFieldType(FieldType fieldType)
93+
private Type GetFieldType(FieldDescriptor fieldType)
9494
{
95-
switch (fieldType)
95+
switch (fieldType.FieldType)
9696
{
9797
case FieldType.Double:
9898
return typeof(double);
@@ -116,6 +116,8 @@ private Type GetFieldType(FieldType fieldType)
116116
return typeof(bool);
117117
case FieldType.String:
118118
return typeof(string);
119+
case FieldType.Message:
120+
return fieldType.MessageType.ClrType;
119121
default:
120122
throw new ArgumentOutOfRangeException(nameof(fieldType), $"FieldType: '{fieldType}' is not supported.");
121123
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"nestedMessage": {
3+
"property": "hello"
4+
}
5+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using System.Text.Json.Protobuf.Tests.Utils;
2+
using Shouldly;
3+
using SmartAnalyzers.ApprovalTestsExtensions;
4+
using Xunit;
5+
6+
namespace System.Text.Json.Protobuf.Tests;
7+
8+
public class MessageWithComplexPropertyTests
9+
{
10+
[Fact]
11+
public void Should_serialize_message_with_complex_property()
12+
{
13+
// Arrange
14+
var msg = new MessageWithComplexProperty
15+
{
16+
NestedMessage = new NestedMessage
17+
{
18+
Property = "hello"
19+
}
20+
};
21+
22+
var jsonSerializerOptions = TestHelper.CreateJsonSerializerOptions();
23+
24+
// Act
25+
var serialized = JsonSerializer.Serialize(msg, jsonSerializerOptions);
26+
27+
// Assert
28+
var approver = new ExplicitApprover();
29+
approver.VerifyJson(serialized);
30+
}
31+
32+
[Fact]
33+
public void Should_deserialize_message_with_complex_property()
34+
{
35+
// Arrange
36+
var msg = new MessageWithComplexProperty
37+
{
38+
NestedMessage = new NestedMessage
39+
{
40+
Property = "hello"
41+
}
42+
};
43+
44+
var jsonSerializerOptions = TestHelper.CreateJsonSerializerOptions();
45+
46+
// Act
47+
var serialized = JsonSerializer.Serialize(msg, jsonSerializerOptions);
48+
var deserialized = JsonSerializer.Deserialize<MessageWithComplexProperty>(serialized, jsonSerializerOptions);
49+
50+
// Assert
51+
deserialized.ShouldBeEquivalentTo(msg);
52+
}
53+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
syntax = "proto3";
2+
3+
option csharp_namespace = "System.Text.Json.Protobuf.Tests";
4+
5+
message MessageWithComplexProperty {
6+
NestedMessage nested_message = 1;
7+
}
8+
9+
message NestedMessage {
10+
string property = 1;
11+
}

0 commit comments

Comments
 (0)