Skip to content

Commit c72dd78

Browse files
committed
Generalize ByteString conversion
1 parent 3128c04 commit c72dd78

7 files changed

Lines changed: 36 additions & 33 deletions

File tree

src/Protobuf.System.Text.Json/InternalConverters/ByteStringConverter.cs

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/Protobuf.System.Text.Json/InternalConverters/InternalConverterFactory.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System.Text.Json;
2-
using Google.Protobuf;
32

43
namespace Protobuf.System.Text.Json.InternalConverters;
54

@@ -24,11 +23,6 @@ public static InternalConverter Create(FieldInfo fieldInfo, JsonSerializerOption
2423
var internalConverter = (InternalConverter) Activator.CreateInstance(typeof(ProtoEnumConverter), args: new object[] { fieldInfo.EnumType, jsonSerializerOptions.Encoder! })!;
2524
return internalConverter;
2625
}
27-
else if (fieldInfo.FieldType == typeof(ByteString))
28-
{
29-
var internalConverter = new ByteStringConverter();
30-
return internalConverter;
31-
}
3226
else
3327
{
3428
var converterType = typeof(FieldConverter<>).MakeGenericType(fieldInfo.FieldType);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public static void AddProtobufSupport(this JsonSerializerOptions options, Action
2323
{
2424
options.Converters.Add(new TimestampConverter());
2525
}
26+
options.Converters.Add(new ByteStringConverter());
2627
options.Converters.Add(new ProtobufJsonConverterFactory(jsonProtobufSerializerOptions));
2728
}
2829

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System.Text.Json;
2+
using System.Text.Json.Serialization;
3+
using Google.Protobuf;
4+
5+
namespace Protobuf.System.Text.Json.WellKnownTypesConverters;
6+
7+
internal class ByteStringConverter : JsonConverter<ByteString?>
8+
{
9+
public override ByteString? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
10+
{
11+
if (reader.GetString() is { } base64String)
12+
{
13+
return ByteString.FromBase64(base64String);
14+
}
15+
16+
return null;
17+
}
18+
19+
public override void Write(Utf8JsonWriter writer, ByteString? value, JsonSerializerOptions options)
20+
{
21+
if (value != null)
22+
{
23+
writer.WriteStringValue(value.ToBase64());
24+
}
25+
}
26+
}

test/Protobuf.System.Text.Json.Tests/MessageWithMapsTests.Should_serialize_message_with_map_field.approved.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,8 @@
88
"a": 1
99
}
1010
}
11+
},
12+
"mapStringToBytesType": {
13+
"string_key": "YWJj"
1114
}
1215
}

test/Protobuf.System.Text.Json.Tests/MessageWithMapsTests.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Text.Json;
22
using System.Text.Json.Protobuf.Tests;
3+
using Google.Protobuf;
34
using Protobuf.System.Text.Json.Tests.Utils;
45
using Shouldly;
56
using SmartAnalyzers.ApprovalTestsExtensions;
@@ -22,7 +23,8 @@ public void Should_serialize_message_with_map_field()
2223
{
2324
MapStringToInt = {["a"] = 1}
2425
}
25-
}
26+
},
27+
MapStringToBytesType = { ["string_key"] = ByteString.CopyFromUtf8("abc") }
2628
};
2729
var jsonSerializerOptions = TestHelper.CreateJsonSerializerOptions();
2830

@@ -47,7 +49,8 @@ public void Should_deserialize_message_with_map_field()
4749
{
4850
MapStringToInt = {["a"] = 1}
4951
}
50-
}
52+
},
53+
MapStringToBytesType = { ["string_key"] = ByteString.CopyFromUtf8("abc") }
5154
};
5255
var jsonSerializerOptions = TestHelper.CreateJsonSerializerOptions();
5356

test/Protobuf.System.Text.Json.Tests/Protos/message_with_maps.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ option csharp_namespace = "System.Text.Json.Protobuf.Tests";
55
message MessageWithMaps {
66
map<int32, string> map_int_to_string = 1;
77
map<string, NestedMessageAsKey> map_string_to_complex_type = 2;
8+
map<string, bytes> map_string_to_bytes_type = 3;
89
}
910

1011
message NestedMessageAsKey {

0 commit comments

Comments
 (0)