From 858d43b881e62a306da5365a12c713ec2b8efe5c Mon Sep 17 00:00:00 2001 From: Loretta Date: Sat, 17 Jan 2026 09:42:06 +0100 Subject: [PATCH] Refactor: add SerializeTypeMetadataBase for serializers Introduce SerializeTypeMetadataBase as a new abstract base class for serializer type metadata, extending TypeMetadataBase. Update Binary, JSON, and Toon serializer metadata classes to inherit from this new base, enabling shared serializer-specific logic and improving code organization. No functional changes to serialization behavior. --- ...ySerializer.BinarySerializeTypeMetadata.cs | 2 +- ...sonSerializer.JsonSerializeTypeMetadata.cs | 2 +- .../Serializers/SerializeTypeMetadataBase.cs | 24 +++++++++++++++++++ ...oonSerializer.ToonSerializeTypeMetadata.cs | 5 ++-- 4 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 AyCode.Core/Serializers/SerializeTypeMetadataBase.cs diff --git a/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializeTypeMetadata.cs b/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializeTypeMetadata.cs index bd91dd8..a82cb85 100644 --- a/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializeTypeMetadata.cs +++ b/AyCode.Core/Serializers/Binaries/AcBinarySerializer.BinarySerializeTypeMetadata.cs @@ -9,7 +9,7 @@ namespace AyCode.Core.Serializers.Binaries; public static partial class AcBinarySerializer { - internal sealed class BinarySerializeTypeMetadata : TypeMetadataBase + internal sealed class BinarySerializeTypeMetadata : SerializeTypeMetadataBase { public BinaryPropertyAccessor[] Properties { get; } diff --git a/AyCode.Core/Serializers/Jsons/AcJsonSerializer.JsonSerializeTypeMetadata.cs b/AyCode.Core/Serializers/Jsons/AcJsonSerializer.JsonSerializeTypeMetadata.cs index 3ee029e..a740f90 100644 --- a/AyCode.Core/Serializers/Jsons/AcJsonSerializer.JsonSerializeTypeMetadata.cs +++ b/AyCode.Core/Serializers/Jsons/AcJsonSerializer.JsonSerializeTypeMetadata.cs @@ -12,7 +12,7 @@ public static partial class AcJsonSerializer private static JsonSerializeTypeMetadata GetTypeMetadata(in Type type) => JsonSerializeTypeMetadata.GetOrCreateMetadata(type, static t => new JsonSerializeTypeMetadata(t)); - private sealed class JsonSerializeTypeMetadata : TypeMetadataBase + private sealed class JsonSerializeTypeMetadata : SerializeTypeMetadataBase { public PropertyAccessor[] Properties { get; } diff --git a/AyCode.Core/Serializers/SerializeTypeMetadataBase.cs b/AyCode.Core/Serializers/SerializeTypeMetadataBase.cs new file mode 100644 index 0000000..0c2bf28 --- /dev/null +++ b/AyCode.Core/Serializers/SerializeTypeMetadataBase.cs @@ -0,0 +1,24 @@ +using System.Reflection; + +namespace AyCode.Core.Serializers; + +/// +/// Base class for serializer type metadata. +/// Extends TypeMetadataBase for serializer-specific functionality. +/// Used by Binary, JSON, and Toon serializers. +/// Generic version provides built-in ThreadLocal caching with zero ref parameter overhead. +/// +/// The concrete metadata type (must inherit from this class). +public abstract class SerializeTypeMetadataBase : TypeMetadataBase + where TMetadata : SerializeTypeMetadataBase +{ + protected SerializeTypeMetadataBase(Type type, Func ignorePropertyFilter) + : base(type, ignorePropertyFilter) + { + // Base class handles: + // - ReadableProperties, WritableProperties + // - IId detection (IsIId, IdType, IdAccessorType, GetIdInt32/64/Guid) + // - CompiledConstructor + // - HasComplexProperties, NeedsReferenceTracking flags (set by derived classes) + } +} diff --git a/AyCode.Core/Serializers/Toons/AcToonSerializer.ToonSerializeTypeMetadata.cs b/AyCode.Core/Serializers/Toons/AcToonSerializer.ToonSerializeTypeMetadata.cs index f5458e5..f2e2f14 100644 --- a/AyCode.Core/Serializers/Toons/AcToonSerializer.ToonSerializeTypeMetadata.cs +++ b/AyCode.Core/Serializers/Toons/AcToonSerializer.ToonSerializeTypeMetadata.cs @@ -10,9 +10,9 @@ public static partial class AcToonSerializer { /// /// Cached metadata for a type including properties, type name, and descriptions. - /// Uses TypeMetadataBase infrastructure for shared caching across all serializers. + /// Uses SerializeTypeMetadataBase infrastructure for shared caching across all serializers. /// - private sealed class ToonSerializeTypeMetadata : TypeMetadataBase + private sealed class ToonSerializeTypeMetadata : SerializeTypeMetadataBase { public string TypeName { get; } public string ShortTypeName { get; } @@ -58,6 +58,7 @@ public static partial class AcToonSerializer } } + /// /// Property accessor with compiled getter and cached navigation metadata. /// Extends PropertyAccessorBase for shared functionality and adds Toon-specific metadata.