2014-10-10 33 views
1

我一直在使用他們提供的SDK導入到第三方客戶端軟件的Windows窗體控件項目。由我試圖加載的另一家公司編寫的自定義控件需要在顯示信息之前登錄到服務器,這可能需要20-30秒。爲了加快速度,我有想法將控制所需的信息預加載到文本文件。由於它不是已知的類型,因此在嘗試序列化類時會引發錯誤。試圖預加載對象到文本文件以加快加載速度的問題

我有一本詞典,我用它來引用回適當的ICamera類。如果我將「cam」從ICamera類型更改爲字符串,例如「cam.GetLiveURL()」。它寫入文本文件沒有問題。這是我用來填充字典的代碼。

 foreach (ICamera cam in _adapter.Cameras()) 
     { 
      OCCamera.Add(cam.GetDisplayName(), cam); 
     } 

我試過XMLSerializer,它似乎有處理字典時遇到困難。

我已經試過的BinaryFormatter並且得到錯誤:

Type 'OCAdapter.OCCamera' in Assembly 'OCAdapter.dll' in not marked as serializable.

我已經試過的DataContractSerializer並且得到錯誤:

Type 'OCAdapter.OCCamera' with data contract name 'OCCamera: http://schemas.datacontract.org/2004/07/OCAdapter ' is not expected. Consider using a DataContractResolver or add ant types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding the to the list of known types passed to DataContractSerializer.

我曾嘗試與DataContractResolver玩弄似乎並不能得到它工作,我根本不理解它。

我用於BinaryFormatter和DataContractSerializer的代碼是直接從MSDN或其他地方進行測試的,沒有自定義類型。

也許有更好的方法來處理這一切,我錯過了它。我不反對爲別的東西放棄字典路線,或者我可以重寫任何數量的其他代碼來使其工作。

+0

「登錄到服務器」是一個相當模糊的說法。這是一個REST HTTP服務嗎?你能給我們一個來自這個「服務器」的樣本回應嗎? – 2014-10-10 16:06:26

+0

它是一個網絡視頻錄像機,NVR。它記錄來自安全攝像頭的流。對不起,我不知道如何回答這個問題。 – TonySchoborg 2014-10-10 16:21:49

回答

0

錯誤1:試圖序列化您的實施而不是*數據。

錯誤2:使用BinaryFormatter ...只是永遠(也許除了AppDomain編組)

我的建議是:創建一個簡單的模型(「DTO」模型),只是表示數據需要,但不根據你的具體實施情況(沒有OCAdapter.OCCamera等)。您可以在中構建此DTO模型,無論您喜歡哪種序列化庫,任何方式都可以方便地使用。我偏愛protobuf-net,但還有很多其他的存在。然後映射到/從您的DTO模型和您的實現模型。

優點:

  • 它會工作
  • 更改執行不影響數據;它只會影響映射代碼
  • 你可以使用任何串行想要
  • 可以版本的數據理智
+0

感謝您的快速回復。我今晚會爲此工作。我必須做一些研究,目前你的解決方案已經過去了。 – TonySchoborg 2014-10-10 16:29:40