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

本文关键字:加载 时间 问题 文件 对象 文本 | 更新日期: 2023-09-27 18:26:08

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

我有一个Dictionary,用来引用回正确的ICamera类。如果我将"cam"从ICamera类型更改为字符串,例如"cam.GetLiveURL()"。它会毫无问题地写入文本文件。这是我用来填充Dictionary的代码。

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

我尝试过XMLSerializer,但它似乎很难处理Dictionary。

我已经尝试了BinaryFormatter并得到错误:

中程序集"OCAdapter.dll"中的类型"OCAdaper.OCCamera"未标记为可序列化。

我已经尝试了DataContractSerializer并得到错误:

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

我试过玩DataContractResolver,但似乎无法让它发挥作用,我根本不理解它。

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

也许有更好的方法来处理这一切,但我错过了它。我不反对为了其他事情而放弃Dictionary路由,或者我可以重写任何数量的其他代码来实现这一点。

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

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

错误2:使用BinaryFormatter。。。几乎永远(除了AppDomain编组)

我的建议是:创建一个简单的模型("DTO"模型),它只代表您需要的数据,但不代表您的具体实现(没有OCAdapter.OCCamera等)。您可以在中构建这个DTO模型,无论您喜欢什么序列化库,都可以使用任何方便的方式。我偏爱protobuf网络,但还有很多其他的存在。然后映射到DTO模型和实现模型。

优点:

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