diff --git a/AyCode.Core.Tests/TestModels/SignalRTestInfrastructure.cs b/AyCode.Core.Tests/TestModels/SignalRTestInfrastructure.cs
index b8a95dc..f0963b1 100644
--- a/AyCode.Core.Tests/TestModels/SignalRTestInfrastructure.cs
+++ b/AyCode.Core.Tests/TestModels/SignalRTestInfrastructure.cs
@@ -15,11 +15,6 @@ public static class SignalRMessageFactory
///
public static readonly MessagePackSerializerOptions ContractlessOptions = ContractlessStandardResolver.Options;
- ///
- /// Cached MessagePack options for Standard resolver
- ///
- public static readonly MessagePackSerializerOptions StandardOptions = MessagePackSerializerOptions.Standard;
-
///
/// Creates a MessagePack message for multiple parameters using IdMessage format.
/// Each parameter is serialized directly as JSON.
@@ -47,7 +42,7 @@ public static class SignalRMessageFactory
{
var json = obj.ToJson();
var postMessage = new SignalRPostMessageDto { PostDataJson = json };
- return MessagePackSerializer.Serialize(postMessage, StandardOptions);
+ return MessagePackSerializer.Serialize(postMessage, ContractlessOptions);
}
///
diff --git a/AyCode.Core/Extensions/JsonUtilities.cs b/AyCode.Core/Extensions/JsonUtilities.cs
index 7251503..87ecaaa 100644
--- a/AyCode.Core/Extensions/JsonUtilities.cs
+++ b/AyCode.Core/Extensions/JsonUtilities.cs
@@ -297,6 +297,73 @@ public static class JsonUtilities
#region Type Checking Methods
+ ///
+ /// Detects the serializer type from the response data.
+ /// Checks the first byte after MessagePack deserialization to determine if it's JSON or Binary format.
+ ///
+ /// The response data (string for JSON, byte[] for Binary)
+ /// The detected serializer type
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static AcSerializerType DetectSerializerType(object? responseData)
+ {
+ return responseData switch
+ {
+ byte[] => AcSerializerType.Binary,
+ string => AcSerializerType.Json,
+ null => AcSerializerType.Json, // Default to JSON for null
+ _ => AcSerializerType.Json // Default to JSON for unknown types
+ };
+ }
+
+ ///
+ /// Detects if byte array contains JSON or Binary serialized data.
+ /// JSON typically starts with '{', '[', '"' or whitespace.
+ /// Binary format starts with version byte (typically 1) followed by metadata flag.
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static AcSerializerType DetectSerializerTypeFromBytes(ReadOnlySpan data)
+ {
+ if (data.IsEmpty) return AcSerializerType.Json;
+
+ var firstByte = data[0];
+
+ // JSON typically starts with: '{' (123), '[' (91), '"' (34), or whitespace (32, 9, 10, 13)
+ // Also numbers: '0'-'9' (48-57), '-' (45), 't' (116 for true), 'f' (102 for false), 'n' (110 for null)
+ return firstByte switch
+ {
+ (byte)'{' or (byte)'[' or (byte)'"' => AcSerializerType.Json,
+ (byte)' ' or (byte)'\t' or (byte)'\n' or (byte)'\r' => AcSerializerType.Json,
+ >= (byte)'0' and <= (byte)'9' => AcSerializerType.Json,
+ (byte)'-' or (byte)'t' or (byte)'f' or (byte)'n' => AcSerializerType.Json,
+ // Binary format version 1 with metadata or no-metadata header
+ 1 when data.Length > 1 && (data[1] == 32 || data[1] == 33) => AcSerializerType.Binary,
+ _ => AcSerializerType.Binary // Default to Binary for unknown byte patterns
+ };
+ }
+
+ ///
+ /// Detects serializer type from a string (checks if it looks like JSON).
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static AcSerializerType DetectSerializerTypeFromString(string? data)
+ {
+ if (string.IsNullOrEmpty(data)) return AcSerializerType.Json;
+
+ var trimmed = data.AsSpan().Trim();
+ if (trimmed.IsEmpty) return AcSerializerType.Json;
+
+ var firstChar = trimmed[0];
+
+ // Valid JSON starts with: '{', '[', '"', number, 't', 'f', 'n'
+ return firstChar switch
+ {
+ '{' or '[' or '"' => AcSerializerType.Json,
+ >= '0' and <= '9' => AcSerializerType.Json,
+ '-' or 't' or 'f' or 'n' => AcSerializerType.Json,
+ _ => AcSerializerType.Binary // Likely Base64 encoded binary
+ };
+ }
+
///
/// Fast primitive check using type code.
///
diff --git a/AyCode.Services.Server.Tests/SignalRs/SignalRTestHelper.cs b/AyCode.Services.Server.Tests/SignalRs/SignalRTestHelper.cs
index d342f64..c6135a4 100644
--- a/AyCode.Services.Server.Tests/SignalRs/SignalRTestHelper.cs
+++ b/AyCode.Services.Server.Tests/SignalRs/SignalRTestHelper.cs
@@ -40,7 +40,7 @@ public static class SignalRTestHelper
{
var json = obj.ToJson();
var postMessage = new SignalPostJsonDataMessage