sql >> データベース >  >> NoSQL >> MongoDB

System.TypeをMongoDbで保存する

    Typeの名前をBSON文字列としてシリアル化するSystem.Typeのサンプルシリアライザーを次に示します。これには、タイプ名がシステムタイプでない場合、または同じアセンブリ内にある場合に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. FieldPathフィールド名に「。」を含めることはできません。 $groupで

    2. プレーンオブジェクトをマングースドキュメントにキャストします

    3. MongoDBのインデックスのリストを取得する

    4. Doocrプロセスのためにbyte[]画像をmongodbに保存する方法