MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Lưu trữ System.Type với MongoDb

Đây là bộ tuần tự mẫu cho System.Type sẽ tuần tự hóa tên của Loại dưới dạng chuỗi BSON. Điều này có một số hạn chế trong đó phương pháp Deserialize không thành công nếu tên kiểu không phải là một kiểu hệ thống hoặc trong cùng một assembly, nhưng bạn có thể điều chỉnh bộ tuần tự mẫu này để viết 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();
    }
}

Bí quyết là làm cho nó được đăng ký đúng cách. Bạn cần đăng ký nó cho cả System.Type và System.RuntimeType, nhưng System.RuntimeType không công khai nên bạn không thể tham chiếu đến nó trong mã của mình. Nhưng bạn có thể thực hiện nó bằng Type.GetType. Đây là mã để đăng ký bộ nối tiếp:

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

Tôi đã sử dụng vòng lặp kiểm tra này để xác minh rằng nó hoạt động:

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

trong đó C chỉ là một lớp trống:

public static class C
{
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cập nhật một đối tượng bên trong một mảng với PyMongo

  2. Lumen và MongoDB?

  3. Có thể kết nối với MongoDB cục bộ bằng Phi tiêu rung không?

  4. Kết nối với bộ bản sao MongoDB bằng rmongodb

  5. Cách tạo phiên trong Node.js