Refactor Populate and add PopulateMerge for byte[] input

Refactored Populate<T>(byte[], T) to add null checks, early returns, and proper context management. Added PopulateMerge<T>(byte[], T) for merge semantics with IId collections, including merge mode and orphaned item removal.
This commit is contained in:
Loretta 2026-02-13 09:46:44 +01:00
parent 96409fe321
commit f84dcb773d
1 changed files with 32 additions and 1 deletions

View File

@ -349,7 +349,16 @@ public static partial class AcBinaryDeserializer
/// Populate existing object from binary data.
/// </summary>
public static void Populate<T>(byte[] data, T target) where T : class
=> Populate(data.AsSpan(), target, AcBinarySerializerOptions.Default);
{
ArgumentNullException.ThrowIfNull(target);
if (data.Length == 0) return;
if (data.Length == 1 && data[0] == BinaryTypeCode.Null) return;
var context = DeserializationContextPool<ArrayBinaryInput>.Get(AcBinarySerializerOptions.Default);
context.InitInput(new ArrayBinaryInput(data));
try { PopulateCore(context, target); }
finally { DeserializationContextPool<ArrayBinaryInput>.Return(context); }
}
/// <summary>
/// Populate existing object from binary data with options.
@ -378,6 +387,28 @@ public static partial class AcBinaryDeserializer
finally { DeserializationContextPool<ArrayBinaryInput>.Return(context); }
}
/// <summary>
/// Populate with merge semantics for IId collections from byte[] (zero-copy).
/// </summary>
public static void PopulateMerge<T>(byte[] data, T target) where T : class
{
ArgumentNullException.ThrowIfNull(target);
if (data.Length == 0) return;
if (data.Length == 1 && data[0] == BinaryTypeCode.Null) return;
var context = DeserializationContextPool<ArrayBinaryInput>.Get(AcBinarySerializerOptions.Default);
context.InitInput(new ArrayBinaryInput(data));
context.IsMergeMode = true;
context.RemoveOrphanedItems = AcBinarySerializerOptions.Default.RemoveOrphanedItems;
try
{
PopulateMergeCore(context, target);
}
finally
{
DeserializationContextPool<ArrayBinaryInput>.Return(context);
}
}
/// <summary>
/// Populate with merge semantics for IId collections.
/// </summary>