73 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using MongoDB.Bson;
 | |
| using MongoDB.Bson.IO;
 | |
| using MongoDB.Bson.Serialization;
 | |
| using Core.Abstractions;
 | |
| 
 | |
| namespace DataProviders.Converters {
 | |
| 
 | |
|   public class EnumerationSerializer<T> : IBsonSerializer<T> where T : Enumeration {
 | |
|     private T Deserialize(IBsonReader reader) => Enumeration.FromValue<T>(BsonSerializer.Deserialize<int>(reader));
 | |
|     private void Serialize(IBsonWriter writer, T value) => BsonSerializer.Serialize(writer, value.Id);
 | |
| 
 | |
|     public Type ValueType { get => typeof(T); }
 | |
| 
 | |
|     public object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) => Deserialize(context.Reader);
 | |
|     public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value) => Serialize(context.Writer, (T)value);
 | |
| 
 | |
| 
 | |
|     T IBsonSerializer<T>.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) => Deserialize(context.Reader);
 | |
|     public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, T value) => Serialize(context.Writer, value);
 | |
|   }
 | |
| 
 | |
|   public class EnumerationListSerializer<T> : IBsonSerializer<List<T>>, IBsonArraySerializer where T : Enumeration { 
 | |
|     private List<T> Deserialize(IBsonReader reader) {
 | |
|       var type = reader.GetCurrentBsonType();
 | |
|       var response = new List<T>();
 | |
| 
 | |
|       switch (type) {
 | |
|         case BsonType.Array:
 | |
|           reader.ReadStartArray();
 | |
|           while (reader.ReadBsonType() != BsonType.EndOfDocument) {
 | |
|             response.Add(Enumeration.FromValue<T>(BsonSerializer.Deserialize<int>(reader)));
 | |
|           }
 | |
| 
 | |
|           reader.ReadEndArray();
 | |
|           return response;
 | |
| 
 | |
|         default:
 | |
|           throw new NotImplementedException($"No implementation to deserialize {type}");
 | |
|       }
 | |
| 
 | |
|       return response;
 | |
|     }
 | |
|     private void Serialize(IBsonWriter writer, List<T> values) {
 | |
|       if (values != null) {
 | |
|         writer.WriteStartArray();
 | |
| 
 | |
|         foreach (var value in values) {
 | |
|           writer.WriteInt32(value.Id);
 | |
|         }
 | |
| 
 | |
|         writer.WriteEndArray();
 | |
|       }
 | |
| 
 | |
|     }
 | |
| 
 | |
|     public Type ValueType { get => typeof(List<T>); }
 | |
| 
 | |
|     public object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) => Deserialize(context.Reader);
 | |
|     public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value) => Serialize(context.Writer, (List<T>)value);
 | |
| 
 | |
|     List<T> IBsonSerializer<List<T>>.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) => Deserialize(context.Reader);
 | |
|     public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, List<T> value) => Serialize(context.Writer, value);
 | |
| 
 | |
|     public bool TryGetItemSerializationInfo(out BsonSerializationInfo serializationInfo) {
 | |
|       string elementName = null;
 | |
|       var serializer = BsonSerializer.LookupSerializer(typeof(string));
 | |
|       var nominalType = typeof(string);
 | |
|       serializationInfo = new BsonSerializationInfo(elementName, serializer, nominalType);
 | |
|       return true;
 | |
|     }
 | |
|   }
 | |
| }
 |