【问题标题】:Setting custom MongoDB BsonSerializer for all classes which inherit from base type为从基类型继承的所有类设置自定义 MongoDB BsonSerializer
【发布时间】:2016-08-18 00:48:14
【问题描述】:

有没有办法为从特定基类型继承的所有类型设置自定义序列化程序?

给定以下类型:

class Identity<T> {
    T Value { get; set; }
}
class StringIdentity : Identity<string> {
}
class PersonIdentity : StringIdentity {
}

使用以下模型:

class Person {
    public PersonId Identity { get; set; }
}

还有下面的序列化器:

class StringIdentitySerializer : IBsonSerializer<StringIdentity>
{
    object IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    {
        return Deserialize(context, args);
    }

    public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, StringIdentity value)
    {
        context.Writer.WriteString(value.Value);
    }

    public StringIdentity Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    {
        return new StringIdentity(context.Reader.ReadString());
    }

    public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
    {
        Serialize(context, args, value as StringIdentity);
    }

    public Type ValueType => typeof(StringIdentity);
}

我认为BsonSerializer.RegisterSerializer(typeof(StringIdentity), new StringIdentitySerializer()); 会将Person 上的我的属性Id 序列化为字符串。

当我将Id 属性更改为StringIdentity 类型时,此序列化程序起作用。

我明白为什么会发生这种情况(PersonIdentityStringIdentity 的类型不同)但是(不装饰 Person 类)我将如何在我的 @ 上获得类型为 PersonIdentity 的属性 Id 987654334@要使用这个序列化器序列化的类吗?

【问题讨论】:

  • 不,我们不希望在 Jira 中出现这样的问题。不过,我会在这里回答。

标签: c# mongodb serialization mongodb-.net-driver bson


【解决方案1】:

所以,这样做的方法是注册一个serialization provider。这将让您拦截所有解析身份的尝试,并对它们做任何您想做的事情。

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2013-04-01
    相关资源
    最近更新 更多