Own serialization options by the document's assembly
The static UntrustedData options are gone. An assembly declares its formatter resolvers with [assembly: CultCacheFormatterResolver(typeof(R))]; CultDocumentMessagePackSerialization.OptionsFor(assembly) composes them ahead of CultDocumentResolver and StandardResolver, once per assembly, and hands assemblies that declare nothing the base Options. Generated codecs and the reflective SerializeUntyped/DeserializeUntyped path both read OptionsFor(typeof(X).Assembly). No registration call, no mutable options, no load order. CultMessagePackSecurity copies UntrustedData and supplies a collision-resistant comparer over CultRecordRef<T>.Key.Value, so ref-keyed dictionaries deserialize. Tests: RefKeyedDictionaryRoundTrips failed on825b4f7("No hash-resistant equality comparer available"); DeclaredResolverEncodesValueTypeAsPositionalArray and UnknownAssemblyGetsBaseOptions did not compile there (new API); InteropNoteBytesUnchanged is a pin whose payload constant was captured on825b4f7. BenchItem, the one unkeyed [CultDocument] in any consumer (in-memory benchmark, no store), gains [Key]s in its existing slot order. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
6fcc2a7704
commit
ea5a07b37a
7 changed files with 270 additions and 10 deletions
|
|
@ -0,0 +1,15 @@
|
|||
using System;
|
||||
|
||||
namespace GameCult.Caching.MessagePack;
|
||||
|
||||
// The resolver type exposes a public static Instance of IFormatterResolver or a public parameterless constructor.
|
||||
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
|
||||
public sealed class CultCacheFormatterResolverAttribute : Attribute
|
||||
{
|
||||
public CultCacheFormatterResolverAttribute(Type resolverType)
|
||||
{
|
||||
ResolverType = resolverType ?? throw new ArgumentNullException(nameof(resolverType));
|
||||
}
|
||||
|
||||
public Type ResolverType { get; }
|
||||
}
|
||||
Loading…
Reference in a new issue