reactredux/webapi/DataProviders/Converters/EnumerationListSerializer.cs

56 lines
2.0 KiB
C#

using MongoDB.Bson;
using MongoDB.Bson.IO;
using MongoDB.Bson.Serialization;
using Core.Abstractions;
namespace DataProviders.Converters {
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}");
}
}
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;
}
}
}