diff --git a/src/Polecat/Serialization/ISerializer.cs b/src/Polecat/Serialization/ISerializer.cs
index c506dea..f308c7f 100644
--- a/src/Polecat/Serialization/ISerializer.cs
+++ b/src/Polecat/Serialization/ISerializer.cs
@@ -1,10 +1,19 @@
using System.Data.Common;
+using System.Diagnostics.CodeAnalysis;
namespace Polecat.Serialization;
///
/// Serialization abstraction for Polecat. Uses System.Text.Json exclusively.
///
+///
+/// The default implementation routes through
+/// System.Text.Json.JsonSerializer, which the .NET trimmer cannot
+/// statically analyse. AOT-publishing apps should plug in a custom
+/// ISerializer implementation backed by an STJ source-generator
+/// context (JsonSerializerContext) rather than the reflection-based
+/// default.
+///
public interface ISerializer
{
///
@@ -20,45 +29,63 @@ public interface ISerializer
///
/// Serialize an object to a JSON string.
///
+ [RequiresUnreferencedCode("Default ISerializer uses STJ reflection over document.GetType()'s properties; AOT consumers should supply a source-generator-backed ISerializer impl.")]
+ [RequiresDynamicCode("Default ISerializer uses STJ reflection which requires runtime code generation.")]
string ToJson(object document);
///
/// Deserialize a JSON string to an object of type T.
///
+ [RequiresUnreferencedCode("Default ISerializer uses STJ reflection; AOT consumers should supply a source-generator-backed ISerializer impl.")]
+ [RequiresDynamicCode("Default ISerializer uses STJ reflection which requires runtime code generation.")]
T FromJson(string json);
///
/// Deserialize a JSON string to an object of the specified type.
///
+ [RequiresUnreferencedCode("Default ISerializer uses STJ reflection; AOT consumers should supply a source-generator-backed ISerializer impl.")]
+ [RequiresDynamicCode("Default ISerializer uses STJ reflection which requires runtime code generation.")]
object FromJson(Type type, string json);
///
/// Deserialize from a Stream.
///
+ [RequiresUnreferencedCode("Default ISerializer uses STJ reflection; AOT consumers should supply a source-generator-backed ISerializer impl.")]
+ [RequiresDynamicCode("Default ISerializer uses STJ reflection which requires runtime code generation.")]
T FromJson(Stream stream);
///
/// Deserialize from a Stream to the specified type.
///
+ [RequiresUnreferencedCode("Default ISerializer uses STJ reflection; AOT consumers should supply a source-generator-backed ISerializer impl.")]
+ [RequiresDynamicCode("Default ISerializer uses STJ reflection which requires runtime code generation.")]
object FromJson(Type type, Stream stream);
///
/// Deserialize from a DbDataReader column.
///
+ [RequiresUnreferencedCode("Default ISerializer uses STJ reflection; AOT consumers should supply a source-generator-backed ISerializer impl.")]
+ [RequiresDynamicCode("Default ISerializer uses STJ reflection which requires runtime code generation.")]
T FromJson(DbDataReader reader, int index);
///
/// Deserialize from a DbDataReader column to the specified type.
///
+ [RequiresUnreferencedCode("Default ISerializer uses STJ reflection; AOT consumers should supply a source-generator-backed ISerializer impl.")]
+ [RequiresDynamicCode("Default ISerializer uses STJ reflection which requires runtime code generation.")]
object FromJson(Type type, DbDataReader reader, int index);
///
/// Async deserialize from a Stream.
///
+ [RequiresUnreferencedCode("Default ISerializer uses STJ reflection; AOT consumers should supply a source-generator-backed ISerializer impl.")]
+ [RequiresDynamicCode("Default ISerializer uses STJ reflection which requires runtime code generation.")]
ValueTask FromJsonAsync(Stream stream, CancellationToken cancellationToken = default);
///
/// Async deserialize from a Stream to the specified type.
///
+ [RequiresUnreferencedCode("Default ISerializer uses STJ reflection; AOT consumers should supply a source-generator-backed ISerializer impl.")]
+ [RequiresDynamicCode("Default ISerializer uses STJ reflection which requires runtime code generation.")]
ValueTask