2016-07-21 9 views
2

Есть ли способ установить собственный сериализатор для всех типов, которые наследуются от определенного базового типа?Настройка настраиваемого MongoDB BsonSerializer для всех классов, которые наследуются от базового типа

Учитывая следующие типы:

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()); бы сериализовать мою собственность Id на Person в качестве строка.

Этот сериализатор работает, когда я изменяю свойство Id типа StringIdentity.

Я понимаю, почему это происходит (PersonIdentity не тот же типа StringIdentity), но (без декорирования Person класса), как бы я получить свойство IdPersonIdentity типа на моем Person классе сериализацию с помощью этого сериалайзера?

+0

[jira.mongodb.org] (https://jira.mongodb.org/secure/Dashboard.jspa) - пожалуйста, задайте там – profesor79

+1

Нет, нам не нужны такие вопросы в Джире. Я отвечу здесь. –

ответ

2

Итак, способ сделать это - зарегистрировать serialization provider. Это позволит вам перехватить все попытки разрешить Identity и делать то, что вы хотите с ними делать.