2014-10-10 31 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