// Copyright Epic Games, Inc. All Rights Reserved.
using System.Reflection;
using EpicGames.Horde;
using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Serializers;
namespace HordeServer.Utilities
{
///
/// Class which serializes object id types to BSON
///
public sealed class BinaryIdBsonSerializer : SerializerBase where TValue : struct where TConverter : BinaryIdConverter, new()
{
readonly TConverter _converter = new TConverter();
///
public override TValue Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) => _converter.FromBinaryId(BinaryIdUtils.FromObjectId(context.Reader.ReadObjectId()));
///
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TValue value) => context.Writer.WriteObjectId(BinaryIdUtils.ToObjectId(_converter.ToBinaryId(value)));
}
///
/// Class which serializes object id types to BSON
///
public sealed class BinaryIdBsonSerializationProvider : BsonSerializationProviderBase
{
///
public override IBsonSerializer? GetSerializer(Type type, IBsonSerializerRegistry serializerRegistry)
{
BinaryIdConverterAttribute? attribute = type.GetCustomAttribute();
if (attribute == null)
{
return null;
}
return (IBsonSerializer?)Activator.CreateInstance(typeof(BinaryIdBsonSerializer<,>).MakeGenericType(type, attribute.ConverterType));
}
}
}