2009-11-11 47 views
1

什麼是通過套接字連接同步對象的好方法?爲套接字/網絡連接同步對象 - 最佳實踐不使用WCF?

這是我到目前爲止想到的。

一個對象在其getter和setter中調用一個Update方法,該方法通過套接字連接將所有類的信息傳遞給其他連接的客戶端。要在客戶端上更新這些更改,將調用一個重載方法,該方法基本上爲其成員的值分析字符串並相應地設置它們。

這是一個合理的方式去做事嗎?對於我讀過的關於Raknet是如何實現它的東西的,你需要實現特定的方法,當一個對象需要更新時,它就會調用它。

如果您處理的所有數據都是原始類型,我可以看到這個工作可能效率低下。但其他課程呢?期望API上的用戶在他們自己的類中調用上述方法是否合理?如果他們使用的標準數據結構沒有被覆蓋的方法會怎麼樣。

我知道有像WCF這樣的事情爲你做這件事,但我真的想實現我自己的解決方案,即使它不是WCF可能的最佳解決方案。

感謝任何建議SO用戶! :)

回答

1

嘗試使用標準的.NET序列化方法將對象轉換爲字符串(或某些二進制blob),請參閱an article here

我不會在每個屬性設置器上調用Update,因爲如果對象具有很多屬性,並且用戶會更改其中幾個屬性,則會有不必要的網絡傳輸,並且速度會很慢。相反,用戶應該調用像BeginUpdate和FinishUpdate這樣的方法,它可以嵌套(所以我會做一個嵌套計數器)。當最外層的FinishUpdate被調用時,您可以在網絡上同步它們。 Setter可以檢查BeginUpdate是否被調用(嵌套計數器大於零),如果沒有,則在這種情況下拋出異常。您甚至可以一次性對象,將要求的BeginUpdate上創建和FinishUpdate的處置,所以你可以寫:

using (var ut = new UpdateTransaction(myObject)) 
// UpdateTransaction constructor calls myObject.BeginUpdate 
{ 
    myObject.MyProp = 5; 
    // ... 
} 
// at the end of using clause Dispose is called, 
// which in turn calls myObject.FinishUpdate 

如果你有複雜的對象,那麼你需要做的是將代表該組的一類對象並將它們全部存儲在列表中。 BeginUpdate/FinishUpdate應該爲這個類實現,而不是單個的對象。