2016-04-04 22 views
0

我有一個類可以作爲BsonDocument序列化到MongoDB中,這個類也碰巧有IMyInterface類型的屬性。將類型信息傳遞給MongoDB,以便它可以正確地反序列化接口類型?

public interface IMyInterface 
{ 
    String Name { get; set; } 
} 

public class MyClass 
{ 
    public IMyInterface IntRef { get; set; } 
} 

在一個MyClass對象實例壽命IntRef可以引用實施IMyInterface多個不同的類。在序列化後,我發現IntRef指向的所有類別的數據也在BsonDocument中序列化,而不僅僅是Name

儘管反序列化雖然BsonDocument.Deserialize沒有關於IntRef指向的類的信息並引發異常。 如何向Deserialize撥打電話Type

我也有一個天真的工作,我Deserialize文件的部分是IntRef,它運作良好。鑑於適當的類TypeBsonDocument.Deserialize返回該Type的對象實例。雖然這裏的問題是我仍然不能Deserialize頂級BsonDocument代表MyClass,因爲它仍然持有有關IntRef的子文檔。 有沒有辦法告訴Deserialize忽略BsonDocument的一部分?我的想法是隻設置MyBsonDocument[SubDocName] = null雖然它不可空。

+0

我自己對Mongo和BsonDocument的經驗有限,但由於您沒有迴應,您是否看到[此SO問題](http://stackoverflow.com/questions/29241788/ignoring-properties-inside-composite - 特性與 - bsonignore)? – Crowcoder

+0

嗯。我猜想它很接近,儘管這是爲了不序列化對象的某個部分,而不是反序列化它。雖然......我認爲'ClassMap'可能是答案的一部分。我將不得不考慮它,我從來沒有見過。 – KDecker

回答

0

由於MyClass指向一個接口類型,該接口類型可以包含任何實現該接口的類Bson,所以我們必須告訴MongoDB類的類型(所有的類)接口。然後它可以從類中推斷出它知道如何反序列化包含這些類Bson的某些BsonDocuments

public interface IMyInterface 
{ 
    String Name { get; set; } 
} 

public class MyIntImpl : IMyInterface 
{ 
    public String Name { get; set; } 
} 

public class MyClass 
{ 
    public IMyInterface IntRef { get; set; } 

    public MyClass() 
    { 
     IntRef = new MyIntImpl(); 
    } 
} 

// When starting up MongoDB 
private void RegisterClasses() 
{ 
    BsonClassMap.RegisterClassMap<MyIntImpl>(); 
} 

通過添加類MyIntImpl到BsonClassMap現在知道如何從該類類型反序列化BSON。你只需要確保你的地圖充滿了實現你可能序列化的接口的類。

一些參考鏈接:High to low level overview of C# MongoDB serializationan SO post概述瞭解決方案。

相關問題