2015-01-20 2 views
1

Используя драйвер mongo C#, могу ли я использовать процесс десериализации, так что для каждого десериализованного объекта типа Foo я могу сразу же манипулировать объектом, прежде чем он будет возвращен вызывающему абоненту?Есть ли «крюк десериализации»?

Упрощенный пример:

class Foo 
{ 
    [BsonIgnore] 
    public bool IsChanged {get;set;} 

    ... 
} 

... 

var foo = Collection.FindOneByIdAs<Foo>(id); 
foo.IsChanged; // true 

ответ

1

Да, вы можете сделать это с пользовательской Foo Serializer

public class FooSerialzer : BsonBaseSerializer 
{ 
    private static readonly IBsonSerializer Serializer; 

    static FooSerialzer() 
    { 
     var classMap = BsonClassMap.LookupClassMap(typeof(Foo)); 
     var serializerType = Type.GetType("MongoDB.Bson.Serialization.BsonClassMapSerializer, MongoDB.Bson", true); 
     Serializer = (IBsonSerializer)Activator.CreateInstance(serializerType, classMap); 
    } 

    public override object Deserialize(BsonReader bsonReader, Type nominalType, IBsonSerializationOptions options) 
    { 
     var document = BsonSerializer.Deserialize<BsonDocument>(bsonReader); 
     var foo = (Foo)Serializer.Deserialize(BsonReader.Create(document), typeof(Foo), options); 

     // do your customization for foo here 
     return foo; 
    } 

    public override void Serialize(BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options) 
    { 
     var foo = (Foo) value; 
     foo.Id = ObjectId.GenerateNewId().ToString(); 

     var document = new BsonDocument(); 
     Serializer.Serialize(BsonWriter.Create(document), nominalType, value, options); 

     BsonSerializer.Serialize(bsonWriter, document); 
    } 
} 

Просто помните, чтобы зарегистрировать это в запуске приложения

BsonSerializer.RegisterSerializer(typeof(Foo), new FooSerialzer()); 

В этом случае вам не нужно сериализовать и десериализовать сложные объекты.

+0

то вам придется реализовать всю сериализацию (сложного объекта) самостоятельно. – i3arnon

+0

@ I3arnon, я придумал новое решение – Disposer

2

Да, вы можете реализовать ISupportInitialize из платформы .NET, и мы будем ссылаться на него соответствующим образом. Смотрите нашу документацию здесь: http://docs.mongodb.org/ecosystem/tutorial/serialize-documents-with-the-csharp-driver/#implementing-isupportinitialize.

+0

Nice. Это немного сложно, потому что тогда мне придется ссылаться на некоторые зависимости в 'Foo' (я хочу избежать статических вызовов в' EndInit'). – seldary

+0

ISupportInitialize не входит в состав драйвера. Это часть BCL. Вам не нужно ссылаться на какие-либо дополнительные сборки. http://msdn.microsoft.com/en-us/library/system.componentmodel.isupportinitialize%28v=vs.110%29.aspx –

+0

Я знаю. Но если 'Foo' реализует его, он должен будет сделать что-то более сложное, чем изменение' IsChanged'. Он бы назвал 'IBar.DoSomething()' и т. Д. Я бы предпочел, чтобы на экземпляре 'Foo' появился другой тип (например,' FooSerializer'). – seldary

Смежные вопросы