尝试将对象预加载到文本文件以加快加载时间的问题

时间:2014-10-10 16:01:26

标签: c# .net dictionary datacontractserializer binaryformatter

我一直致力于Windows Form Control项目,使用他们提供的SDK导入第三方客户端软件。我试图加载的另一家公司编写的自定义控件需要在显示信息之前登录到服务器,这可能需要20-30秒。为了加快速度,我有想法将控件所需的信息预加载到文本文件中。由于它不是已知类型,因此在尝试序列化类时会抛出错误。

我有一个字典,我用来引用正确的ICamera类。如果我将“cam”从ICamera类型更改为字符串,例如“cam.GetLiveURL()”。它写文本文件没有问题。这是我用来填充词典的代码。

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

我已经尝试过XMLSerializer,它似乎很难处理字典。

我尝试过BinaryFormatter并收到错误:

  

在程序集'OCAdapter.dll'中键入'OCAdapter.OCCamera'未标记为可序列化。

我尝试过DataContractSerializer并收到错误:

  

输入带有数据合约名称的'OCAdapter.OCCamera'   'OCCamera:http://schemas.datacontract.org/2004/07/OCAdapter'不是   预期。考虑使用DataContractResolver或不添加ant类型   静态地知道已知类型的列表 - 例如,通过使用   KnownTypeAttribute属性或通过添加到已知的列表   传递给DataContractSerializer的类型。

我尝试使用DataContractResolver并且似乎无法使其工作,我根本不理解。

我用于BinaryFormatter和DataContractSerializer的代码直接来自MSDN或其他地方,并且在没有自定义类型的情况下测试正常。

也许有更好的方法来处理所有这些,我想念它。我并不反对放弃使用Dictionary方法获取其他内容,或者我可以重写任何其他代码来使其工作。

1 个答案:

答案 0 :(得分:0)

错误1:尝试序列化实现而不是*数据。

错误2:使用BinaryFormatter ......几乎所有(除了AppDomain编组除外)

我的建议:创建一个简单的模型(" DTO"模型),它只代表您需要的数据,但不代表您的具体实现(不是{{1}等)。您可以在中以任何方便的方式构建此DTO模型,无论您喜欢哪种序列化库。我偏爱protobuf-net,但还有很多其他的存在。然后映射到您的DTO模型和您的实施模型。

优点:

  • 它会工作
  • 对实施的更改不会影响数据;它只影响映射代码
  • 您可以使用任何您想要的序列化程序
  • 您可以合理地对数据进行版本化