diff --git a/src/Smdn.Net.EchonetLite.Appendix/Smdn.Net.EchonetLite.Appendix.csproj b/src/Smdn.Net.EchonetLite.Appendix/Smdn.Net.EchonetLite.Appendix.csproj index 814c2ac..6d9171c 100644 --- a/src/Smdn.Net.EchonetLite.Appendix/Smdn.Net.EchonetLite.Appendix.csproj +++ b/src/Smdn.Net.EchonetLite.Appendix/Smdn.Net.EchonetLite.Appendix.csproj @@ -53,7 +53,8 @@ SPDX-License-Identifier: MIT - IL2026;SA1005;SA1028;SA1110;SA1306;SA1309;SA1313;SA1505;SA1508;SA1513;SA1514;SA1518;SA1616;SA1623;SA1629;SA1642;SA1649;$(NoWarn) + SA1005;SA1028;SA1110;SA1306;SA1309;SA1313;$(NoWarn) + SA1505;SA1508;SA1513;SA1514;SA1518;SA1616;SA1623;SA1629;SA1642;SA1649;$(NoWarn) diff --git a/src/Smdn.Net.EchonetLite.Appendix/Smdn.Net.EchonetLite.Appendix/JsonSerializerSourceGenerationContext.cs b/src/Smdn.Net.EchonetLite.Appendix/Smdn.Net.EchonetLite.Appendix/JsonSerializerSourceGenerationContext.cs new file mode 100644 index 0000000..d038739 --- /dev/null +++ b/src/Smdn.Net.EchonetLite.Appendix/Smdn.Net.EchonetLite.Appendix/JsonSerializerSourceGenerationContext.cs @@ -0,0 +1,11 @@ +// SPDX-FileCopyrightText: 2024 smdn +// SPDX-License-Identifier: MIT +using System.Text.Json.Serialization; + +namespace Smdn.Net.EchonetLite.Appendix; + +// use source generation in System.Text.Json +// ref: https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/source-generation +[JsonSerializable(typeof(SpecificationMaster.SpecificationMasterJsonObject))] +[JsonSerializable(typeof(PropertyMaster))] +internal partial class JsonSerializerSourceGenerationContext : JsonSerializerContext { } diff --git a/src/Smdn.Net.EchonetLite.Appendix/Smdn.Net.EchonetLite.Appendix/SpecificationMaster.cs b/src/Smdn.Net.EchonetLite.Appendix/Smdn.Net.EchonetLite.Appendix/SpecificationMaster.cs index 5902652..a6c41d6 100644 --- a/src/Smdn.Net.EchonetLite.Appendix/Smdn.Net.EchonetLite.Appendix/SpecificationMaster.cs +++ b/src/Smdn.Net.EchonetLite.Appendix/Smdn.Net.EchonetLite.Appendix/SpecificationMaster.cs @@ -20,7 +20,7 @@ internal sealed class SpecificationMaster { /// /// JSONデシリアライズ用のオブジェクト /// - private sealed class SpecificationMasterJsonObject { + internal sealed class SpecificationMasterJsonObject { /// /// ECHONET Lite SPECIFICATIONのバージョン /// @@ -126,7 +126,10 @@ public static SpecificationMaster GetInstance() using var stream = GetSpecificationMasterDataStream(specificationMasterJsonFileName); _Instance = new( - JsonSerializer.Deserialize(stream) ?? throw new InvalidOperationException($"failed to deserialize {specificationMasterJsonFileName}") + JsonSerializer.Deserialize( + stream, + JsonSerializerSourceGenerationContext.Default.SpecificationMasterJsonObject + ) ?? throw new InvalidOperationException($"failed to deserialize {specificationMasterJsonFileName}") ); } @@ -173,7 +176,10 @@ byte classCode // スーパークラスのプロパティを列挙 using (var stream = GetSpecificationMasterDataStream($"{classGroupSpec.SuperClassName}.json")) { - var superClassProperties = JsonSerializer.Deserialize(stream) ?? throw new InvalidOperationException($"{nameof(PropertyMaster)} can not be null"); + var superClassProperties = JsonSerializer.Deserialize( + stream, + JsonSerializerSourceGenerationContext.Default.PropertyMaster + ) ?? throw new InvalidOperationException($"{nameof(PropertyMaster)} can not be null"); properties.AddRange(superClassProperties.Properties); } @@ -187,7 +193,11 @@ byte classCode // クラスのプロパティを列挙 using (var stream = GetSpecificationMasterDataStream(classGroupDirectoryName, classFileName)) { if (stream is not null) { - var classProperties = JsonSerializer.Deserialize(stream) ?? throw new InvalidOperationException($"{nameof(PropertyMaster)} can not be null"); + var classProperties = JsonSerializer.Deserialize( + stream, + JsonSerializerSourceGenerationContext.Default.PropertyMaster + ) ?? throw new InvalidOperationException($"{nameof(PropertyMaster)} can not be null"); + properties.AddRange(classProperties.Properties); } } diff --git a/src/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite.Serialization.Json/JsonSerializerSourceGenerationContext.cs b/src/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite.Serialization.Json/JsonSerializerSourceGenerationContext.cs new file mode 100644 index 0000000..794f0a1 --- /dev/null +++ b/src/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite.Serialization.Json/JsonSerializerSourceGenerationContext.cs @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: 2024 smdn +// SPDX-License-Identifier: MIT +using System.Text.Json.Serialization; + +using Smdn.Net.EchonetLite.Protocol; + +namespace Smdn.Net.EchonetLite.Serialization.Json; + +// use source generation in System.Text.Json +// ref: https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/source-generation +[JsonSerializable(typeof(Frame))] +internal partial class JsonSerializerSourceGenerationContext : JsonSerializerContext { } diff --git a/src/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite.csproj b/src/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite.csproj index 620bbc0..92900ac 100644 --- a/src/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite.csproj +++ b/src/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite.csproj @@ -38,7 +38,10 @@ SPDX-License-Identifier: MIT - CS3001;CS3003;CS3005;IL2026;SA1000;SA1001;SA1004;SA1005;SA1024;SA1106;SA1110;SA1113;SA1122;SA1137;SA1208;SA1210;SA1309;SA1313;SA1316;SA1402;SA1413;SA1414;SA1505;SA1507;SA1508;SA1513;SA1514;SA1614;SA1623;SA1629;SA1642;$(NoWarn) + CS3001;CS3003;CS3005;$(NoWarn) + SA1000;SA1001;SA1004;SA1005;SA1024;SA1106;SA1110;SA1113;SA1122;SA1137;SA1208;SA1210;$(NoWarn) + SA1309;SA1313;SA1316;SA1402;SA1413;SA1414;$(NoWarn) + SA1505;SA1507;SA1508;SA1513;SA1514;SA1614;SA1623;SA1629;SA1642;$(NoWarn) diff --git a/src/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite/EchonetClient.LowerLayer.cs b/src/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite/EchonetClient.LowerLayer.cs index c624f3d..919c719 100644 --- a/src/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite/EchonetClient.LowerLayer.cs +++ b/src/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite/EchonetClient.LowerLayer.cs @@ -11,6 +11,7 @@ using Microsoft.Extensions.Logging; using Smdn.Net.EchonetLite.Protocol; +using Smdn.Net.EchonetLite.Serialization.Json; namespace Smdn.Net.EchonetLite; @@ -65,7 +66,7 @@ private void EchonetDataReceived(object? sender, (IPAddress address, ReadOnlyMem // ECHONETLiteフレームではないため無視 return; - _logger?.LogTrace($"Echonet Lite Frame受信: address:{value.address}\r\n,{JsonSerializer.Serialize(frame)}"); + _logger?.LogTrace($"Echonet Lite Frame受信: address:{value.address}\r\n,{JsonSerializer.Serialize(frame, JsonSerializerSourceGenerationContext.Default.Frame)}"); FrameReceived?.Invoke(this, (value.address, frame)); } @@ -92,7 +93,7 @@ private async ValueTask SendFrameAsync(IPAddress? address, Action