2012-07-04 48 views
8

通過TableServiceEntity將數據存儲在Azure表服務中,您僅限於具有公共get/set的常見基本類型(int,string,datetime等)。Azure TableServiceEntity - 存儲複雜類

有沒有通常的魔術你來自系列化與收藏,複雜類型,涉及期待繼承等

處理這個問題的不同方式可能是

我錯過了什麼?在哪些情況下哪種方法可能最好?

回答

5

ATS支持繼承。所實現的具體類中的所有繼承屬性將被持久化並檢索。但是,複雜的類型確實不被支持。

至少有一種方法可以處理對象樹和對象關係的持久性: 將相關對象分別存儲在不同的PartitionKey/RowKey下。

實現該方法的最簡單(暴力)方式可能需要您多次調用ATS,以便您可以正確地反序列化對象。

如果針對存儲執行的事務數量比使用的存儲空間和帶寬更重要,那麼該方法的更優雅的擴展將是爲您的實體實現接口並創建一個實現所有這些實體的「寬」聯合實體接口 - 這是存儲和檢索的人。檢索的每個聯合對象僅通過特定的接口使用。您可以通過這種方式存儲集合以及簡單相關的實體 - 只需確保您的PartitionKey對於與Union對象相關的每個人都是相同的,並且您可以識別哪個Union對象表示哪個實體類型。

HTH

3

我不知道這是否回答你的問題,但如果你需要上傳複雜的類型,你可以在數據只是序列化爲一個字節數組。

我需要上傳一個KeyValuePair列表到TableStorage,所以我只是使用二進制格式化程序將其序列化爲一個字節數組,然後反序列化並在檢索時將其反轉。

序列化:

MemoryStream ms = new MemoryStream(); 
BinaryFormatter bf = new BinaryFormatter(); 
bf.Serialize(ms, keyValuePairList); 
byte[] ba = ms.ToArray(); 

反序列化,並投退:

MemoryStream ms = new MemoryStream(byteArray); 
BinaryFormatter bf = new BinaryFormatter(); 
var obj = bf.Deserialize(ms); 

//cast object back to List of KeyValuePair 
var keyValuePairList = (List< KeyValuePair<string,string> >)obj; 
+0

感謝沙欣 - 我介紹,關於「鉤住WritingEntity和ReadingEntity事件」,但我想你也可以只這樣做是爲了一個只讀的byte []屬性,並且只保留Read/WriteEntity – Ryan