// 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)); } } }