MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Съхраняване на System.Type с MongoDb

Ето примерен сериализатор за System.Type, който сериализира името на типа като BSON низ. Това има някои ограничения, тъй като методът Deserialize се проваля, ако името на типа не е системен тип или в същия асембли, но бихте могли да промените този примерен сериализатор, за да напише AssemblyQualifiedName вместо това.

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

Номерът е да го регистрирате правилно. Трябва да го регистрирате както за System.Type, така и за System.RuntimeType, но System.RuntimeType не е публичен, така че не можете да го използвате във вашия код. Но можете да го постигнете с помощта на Type.GetType. Ето кода за регистриране на сериализатора:

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

Използвах този тестов цикъл, за да проверя дали работи:

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

където C е просто празен клас:

public static class C
{
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:Искам да съхранявам обект от масив в колекция

  2. Модулът не е намерен:Грешка:Не може да се разреши „dns“ при използване на MongoDB

  3. Mongoose:Рекурсивен вграден документ в Coffeescript

  4. Преоформете масив, който се съхранява в колекция и експортирайте в CSV

  5. Как да върна само НЯКОИ полета ($project) от агрегирането на Mongodb, като същевременно използвам $match, $lookup И $filter