Skip to content

Commit f7f6d9d

Browse files
committed
Add Enum support to Bson serialization
1 parent 0cd15ae commit f7f6d9d

3 files changed

Lines changed: 30 additions & 13 deletions

File tree

CoreRemoting.Tests/BsonSerializationTests.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@
22
using System.Collections;
33
using System.Data;
44
using System.Globalization;
5-
using System.IO;
6-
using System.Linq;
75
using System.Net;
86
using System.Numerics;
9-
using System.Runtime.Serialization.Formatters.Binary;
107
using System.Text;
118
using CoreRemoting.RpcMessaging;
129
using CoreRemoting.Serialization.Bson;
@@ -285,5 +282,16 @@ public void BsonSerializerAdapter_should_deserialize_Hashtable_original_content_
285282

286283
Assert.Equal(originalValue, deserializedValue);
287284
Assert.True(deserializedValue is int);
285+
286+
var enumHashtable = new Hashtable();
287+
var originalEnumValue = Tools.TestEnum.Second;
288+
enumHashtable["StoredEnum"] = originalEnumValue;
289+
290+
var enumSerializedBytes = serializer.Serialize(enumHashtable);
291+
var deserializedEnumHashtable = serializer.Deserialize<Hashtable>(enumSerializedBytes);
292+
var deserializedEnumValue = deserializedEnumHashtable["StoredEnum"];
293+
294+
Assert.Equal(originalEnumValue, deserializedEnumValue);
295+
Assert.True(deserializedEnumValue is Tools.TestEnum);
288296
}
289297
}

CoreRemoting/Serialization/Bson/Converters/HashtableConverter.cs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -149,18 +149,18 @@ public override void WriteJson(JsonWriter writer, Hashtable value, JsonSerialize
149149
// Convert types if needed
150150
if (key != null)
151151
{
152-
if (keyPrimitiveType.HasValue)
153-
key = ConvertValueFromPrimitiveType(key, keyPrimitiveType.Value);
154-
else if (keyTypeName != null)
152+
if (keyTypeName != null)
155153
key = ConvertValueOptimized(key, keyTypeName);
154+
else if (keyPrimitiveType.HasValue)
155+
key = ConvertValueFromPrimitiveType(key, keyPrimitiveType.Value);
156156
}
157157

158158
if (value != null)
159159
{
160-
if (valuePrimitiveType.HasValue)
161-
value = ConvertValueFromPrimitiveType(value, valuePrimitiveType.Value);
162-
else if (valueTypeName != null)
160+
if (valueTypeName != null)
163161
value = ConvertValueOptimized(value, valueTypeName);
162+
else if (valuePrimitiveType.HasValue)
163+
value = ConvertValueFromPrimitiveType(value, valuePrimitiveType.Value);
164164
}
165165

166166
return (key, value);
@@ -180,7 +180,7 @@ private void WriteEntryOptimized(JsonWriter writer, object key, object value, Js
180180
if (keyType != null)
181181
{
182182
var keyPrimitiveType = GetPrimitiveType(keyType);
183-
if (keyPrimitiveType != PrimitiveType.Complex)
183+
if (keyPrimitiveType != PrimitiveType.Complex && keyPrimitiveType != PrimitiveType.Enum)
184184
{
185185
writer.WritePropertyName("KP");
186186
writer.WriteValue((byte)keyPrimitiveType);
@@ -199,7 +199,7 @@ private void WriteEntryOptimized(JsonWriter writer, object key, object value, Js
199199
if (valueType != null)
200200
{
201201
var valuePrimitiveType = GetPrimitiveType(valueType);
202-
if (valuePrimitiveType != PrimitiveType.Complex)
202+
if (valuePrimitiveType != PrimitiveType.Complex && valuePrimitiveType != PrimitiveType.Enum)
203203
{
204204
writer.WritePropertyName("VP");
205205
writer.WriteValue((byte)valuePrimitiveType);
@@ -257,6 +257,11 @@ private object ConvertValueFromPrimitiveType(object value, PrimitiveType primiti
257257
return Convert.ToUInt32(value);
258258
case PrimitiveType.UInt64:
259259
return Convert.ToUInt64(value);
260+
case PrimitiveType.Enum:
261+
// For enums, we need the type information from VT field
262+
// This method is called when we have primitive type info only
263+
// So we can't handle enum conversion here without type info
264+
return value;
260265
default:
261266
return value;
262267
}
@@ -310,6 +315,8 @@ private object ConvertValueOptimized(object value, string typeName)
310315
return Convert.ToUInt32(value);
311316
case PrimitiveType.UInt64:
312317
return Convert.ToUInt64(value);
318+
case PrimitiveType.Enum:
319+
return Enum.ToObject(targetType, value);
313320
default:
314321
// For complex types, return as-is since they should already be deserialized correctly
315322
return value;
@@ -328,9 +335,9 @@ private string GetTypeNameCached(Type type)
328335
{
329336
var sb = _stringBuilder.Value;
330337
sb.Clear();
331-
sb.Append(t.Assembly.GetName().Name);
332-
sb.Append(", ");
333338
sb.Append(t.FullName);
339+
sb.Append(", ");
340+
sb.Append(t.Assembly.GetName().Name);
334341
return sb.ToString();
335342
});
336343
}
@@ -371,6 +378,7 @@ private PrimitiveType GetPrimitiveType(Type type)
371378
if (t == typeof(ushort)) return PrimitiveType.UInt16;
372379
if (t == typeof(uint)) return PrimitiveType.UInt32;
373380
if (t == typeof(ulong)) return PrimitiveType.UInt64;
381+
if (t.IsEnum) return PrimitiveType.Enum;
374382
return PrimitiveType.Complex;
375383
});
376384
}

CoreRemoting/Serialization/Bson/Converters/PrimitiveType.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ internal enum PrimitiveType : byte
2121
UInt16 = 13,
2222
UInt32 = 14,
2323
UInt64 = 15,
24+
Enum = 16,
2425
Complex = 255
2526
}
2627
}

0 commit comments

Comments
 (0)