MongoDB學習(翻譯5)

2021-09-08 07:05:30 字數 3628 閱讀 8419

本文件基於c#官方驅動1.8版本。

本節c#驅動教程談論c#類到bson物件的序列化和反序列化。序列化是對映乙個物件到可儲存到mongodb庫中bson物件的過程,反序列化由bson文件重建物件的逆過程。因此,序列化過程通常被稱為「物件對映」

序列化使用bson庫處理。bson庫擁有乙個可擴充套件的序列化結構,所以你可以控制你的序列化方式。bson庫提供的預設的序列化其可以滿足你大部分的需求,如果你需要特殊處理,你可以對其進行擴充套件。

預設序列化器通過「類對映」來處理。類對映是定義類和bson文件物件間對映的一種結構,它包含一系列參與序列化的字段或屬性並且為每乙個定義了所需的序列化引數(例如,bson元素名,代表選項等)。

預設的序列化器也內建了對.net資料型別(原始型別、陣列、集合、字典等)的支援。

序列化乙個類物件之前,該類對映必須存在,可以手動建立類對映也可以簡單的通過自動對映來建立。你可以在類自動對映的過程中通過使用序列化相關特性或者初始化**的方式施加一些控制。

在你的初始化**中建立類對映:

bsonclassmap.registerclassmap();

在此myclass會被自動對映或者註冊,當然你可以讓你的類通過序列化器自動對映。

如果你想控制建立的類對映,你可以在乙個lambda表示式中提供您自己的初始化**:

bsonclassmap.registerclassmap);

另外,也可以使用自動對映,然後覆寫一些結果。稍後我們將會看到這方面的例子。

注意類對映必須只能被註冊一次(如果你試著多次註冊同乙個類,會丟擲異常)。

if (!bsonclassmap.isclassmapregistered(typeof

(myclass)))

creator maps

使用乙個表示式,你可以按照下面方式通過驅動使用乙個creator map

public

class

person

public

string lastname

public person(string firstname, string

lastname) }

bsonclassmap.registerclassmap

(cm =>);

解析表示式樹使建構函式第乙個引數和firstname相關,使建構函式第二個引數和lastname屬性相關。還有其他更複雜的方式處理這種情況,當需要時,可以研究探索。

通過特性:

public

class

person

public

string lastname

[bsonconstructor]

public person(string firstname, string

lastname)

}

當不止乙個建構函式是,我們通過「滿足大多數引數」這一策略來確定哪個是最好的匹配,例如:

public

class

person

public

string lastname

public datetime? birthdate

[bsonconstructor]

public person(string firstname, string

lastname)

[bsonconstructor]

public person(string firstname, string

lastname, datetime birthdate)

}

如果資料庫中文件物件有乙個birthdate欄位,我們會選擇使用包含3個引數的建構函式,因為它更具體。

除了上面**和屬性的形式,對映一建立者可以通過約定(約束)來處理。

約定(約束)

自動進行類對映有許多需要考慮的方面,例如

. 例如

這些問題的答案就代表一組約定。對於每乙個約定都有乙個預設的慣例,它是最有可能被您使用的乙個,在必要時也可以重新個別約定(甚至寫你自己的)。

如果你想使用和預設約定不同的自己的約定,可以很簡單的建立乙個conventionpack的例項,新增你想使用的約定進去,然後註冊(換句話說,當你使用具體約定的時候通知序列化器)。例如:

var myconventions = new

conventionpack();

pack.add(

newcamelcaseelementnameconvention());

conventionregistry.register(

"my custom conventions",

pack,

t => t.fullname.startswith("

mynamespace.

"));

第三個引數是用來定義何時使用這個約定包的過濾器方法。在這種情況下,也就是指如果任何類的全名以mynamespace開頭的話應該使用myconventions約定。

由上面我們已經了解到,除了預定的約定(約束),你可以自定義自己的約定(約束)。有4個可以讓我們建立和註冊自定義約定的類,執行在不同(階段)級別。

類(階段)級別:iclassmapconvention

執行針對類對映階段.

方法(成員)級別(階段):imembermapconvention

執行針對在iclassmapconvention階段發現對映的每名成員

creator階段:icreatormapconvention

執行針對在iclassmapconvention階段發現對映的creatormap

後期處理階段:ipostprocessingconvention

執行針對類對映階段.

約定在他們註冊的每個階段順序執行,預設的約定會先註冊,這就允許任何使用者註冊的約定覆蓋掉預設的約定。所以某些值可能得到應用和覆寫,這就要求使用者確保註冊順序的正確性。

注意:

如果乙個ipostprocessingconvention的自定義實現的註冊早於乙個iclassmapconvention的自定義實現,那麼iclassmapconvention先執行,因為它是執行類階段是早於後處理階段的。

待續。。。。

下篇介紹:

field or property level serialization options

MongoDB學習(翻譯7)

接上篇 手動構造類對映時您可以簡單地通過不將字段或屬性新增到類對映。當使用自動對映你需要指定應忽略該字段或屬性的方法。可以使用屬性編寫如下編寫 public class myclass 或使用初始化 而不屬性 bsonclassmap.registerclassmap cm 預設為空的值序列化到 b...

MongoDB學習筆記5 測試查詢效能

大規模資料匯入實驗 在上乙個實驗 中,我們測試了匯入資料的效能,簡單總結一下測試方法 1.schema 每行資料三個字段,日期 id和當日流量,都是長整型 2.index inventory.create index date ascending id ascending unique false,...

HGE教程翻譯(5)

使用曲面變換 在這個教程中我們學習如何使用曲面變形,一種可以建立水面 透鏡 紙張甚至實時的變化。我們使用靜態的紋理,但你可以渲染你的整個遊戲場景到乙個紋理,通過扭曲網格來達到一些很酷的實時特效。首先包含標頭檔案和變數的宣告。include include include hge hge 0 htex...