sql >> Database teknologi >  >> NoSQL >> MongoDB

Lagring af System.Typ med MongoDb

Her er et eksempel på serializer til System.Type, der serialiserer navnet på typen som en BSON-streng. Dette har nogle begrænsninger, idet Deserialize-metoden mislykkes, hvis typenavnet ikke er en systemtype eller i den samme assembly, men du kan justere denne prøveserializer for at skrive AssemblyQualifiedName i stedet.

public class TypeSerializer : IBsonSerializer
{
    public object Deserialize(BsonReader reader, Type nominalType, IBsonSerializationOptions options)
    {
        var actualType = nominalType;
        return Deserialize(reader, nominalType, actualType, options);
    }

    public object Deserialize(BsonReader reader, Type nominalType, Type actualType, IBsonSerializationOptions options)
    {
        if (reader.CurrentBsonType == BsonType.Null)
        {
            return null;
        }
        else
        {
            var fullName = reader.ReadString();
            return Type.GetType(fullName);
        }
    }

    public bool GetDocumentId(object document, out object id, out Type idNominalType, out IIdGenerator idGenerator)
    {
        throw new InvalidOperationException();
    }

    public void Serialize(BsonWriter writer, Type nominalType, object value, IBsonSerializationOptions options)
    {
        if (value == null)
        {
            writer.WriteNull();
        }
        else
        {
            writer.WriteString(((Type)value).FullName);
        }
    }

    public void SetDocumentId(object document, object id)
    {
        throw new InvalidOperationException();
    }
}

Tricket er at få det registreret ordentligt. Du skal registrere det for både System.Type og System.RuntimeType, men System.RuntimeType er ikke offentligt, så du kan ikke henvise til det i din kode. Men du kan komme til det ved at bruge Type.GetType. Her er koden til at registrere serializeren:

var typeSerializer = new TypeSerializer();
BsonSerializer.RegisterSerializer(typeof(Type), typeSerializer);
BsonSerializer.RegisterSerializer(Type.GetType("System.RuntimeType"), typeSerializer);

Jeg brugte denne testloop til at bekræfte, at den virkede:

var types = new Type[] { typeof(int), typeof(string), typeof(Guid), typeof(C) };
foreach (var type in types)
{
    var json = type.ToJson();
    Console.WriteLine(json);
    var rehydratedType = BsonSerializer.Deserialize<Type>(json);
    Console.WriteLine("{0} -> {1}", type.FullName, rehydratedType.FullName);
}

hvor C blot er en tom klasse:

public static class C
{
}


  1. mongodb grupperer værdier efter flere felter

  2. MongoDB Reactive Streams runtime afhængighedsfejl med Alpakka Mongo Connector ClassNotFoundException

  3. Forbindelse til Redis-klyngen mislykkedes

  4. Sådan finder du alle samlingerne fra mongoose