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