diff --git a/AyCode.Core/Serializers/AcSerializeBase.cs b/AyCode.Core/Serializers/AcSerializeBase.cs
new file mode 100644
index 0000000..f1d36c0
--- /dev/null
+++ b/AyCode.Core/Serializers/AcSerializeBase.cs
@@ -0,0 +1,30 @@
+using System.Runtime.CompilerServices;
+
+namespace AyCode.Core.Serializers;
+
+///
+/// Abstract base class for serialization operations.
+/// Contains serialize-specific logic that may need override capability.
+///
+/// Responsibilities:
+/// - Reference scanning (ScanReferences)
+/// - Reference tracking during write (TrackForScanning, ShouldWriteId, MarkAsWritten)
+/// - IId-aware serialization logic
+///
+/// Derived classes:
+/// - BinarySerializationContext (or similar) for Binary serialization
+/// - JsonSerializationContext (or similar) for JSON serialization
+/// - ToonSerializationContext for Toon serialization
+///
+/// Note: Currently SerializationReferenceTracker remains in AcSerializerCommon.
+/// As patterns emerge, serialize-specific methods can be moved here.
+///
+public abstract class AcSerializeBase
+{
+ // Future: Move serialize-specific logic here
+ // - SerializationReferenceTracker (or make it a protected property)
+ // - Virtual ComputeHash method (for IId vs Reference distinction)
+ // - Virtual TrackForScanning method
+ // - Virtual ShouldWriteRef method
+ // - etc.
+}
diff --git a/AyCode.Core/Serializers/AcSerializerCommon.cs b/AyCode.Core/Serializers/AcSerializerCommon.cs
index a59ce38..ed92ead 100644
--- a/AyCode.Core/Serializers/AcSerializerCommon.cs
+++ b/AyCode.Core/Serializers/AcSerializerCommon.cs
@@ -878,23 +878,27 @@ public static class AcSerializerCommon
///
/// Common reference tracking for serialization.
- /// Used by both JSON and Binary serializers to track multi-referenced objects.
- /// Supports both ReferenceEquals-based tracking and IId-based tracking.
- /// Uses int IDs for efficiency (no string allocation).
+ /// Uses unified Bloom filter + HashSet for both IId and Reference tracking.
+ /// - IId objects: hash = Id (positive, DB guarantees uniqueness per entity type)
+ /// - Non-IId objects: hash = RuntimeHelpers.GetHashCode | 0x80000000 (negative)
///
public sealed class SerializationReferenceTracker
{
- private const int InitialReferenceCapacity = 64;
- private const int InitialMultiRefCapacity = 32;
+ private const int InitialCapacity = 128;
+
+ // Unified Bloom filter (256 bits = 4 x 64-bit)
+ private ulong _bloom0, _bloom1, _bloom2, _bloom3;
+
+ // Unified HashSet for seen hashes (both IId and Reference)
+ private HashSet? _seenHashes;
+
+ // Multi-referenced hashes
+ private HashSet? _multiRefHashes;
+
+ // Written refs: hash → refId
+ private Dictionary? _writtenRefs;
- private Dictionary