【问题标题】:Problems trying to pre-load objects to a text file for faster load times尝试将对象预加载到文本文件以加快加载时间的问题
【发布时间】:2014-10-10 16:01:25
【问题描述】:

我一直在开发一个 Windows 窗体控件项目,以使用他们提供的 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 或添加蚂蚁类型 静态已知的已知类型列表 - 例如,通过使用 KnownTypeAttribute 属性或通过添加到已知列表中 传递给 DataContractSerializer 的类型。

我尝试过使用 DataContractResolver,但似乎无法让它工作,我完全不明白。

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

也许有更好的方法来处理这一切,我想念它。我不反对放弃 Dictionary 路线以换取其他东西,或者我可以重写任何数量的其他代码来完成这项工作。

【问题讨论】:

  • “登录到服务器”是一个相当模糊的陈述。这是 REST HTTP 服务吗?你能给我们一个来自这个“服务器”的响应示例吗?
  • 这是一个网络录像机,NVR。它记录来自安全摄像头的流。很抱歉,我不知道如何更好地回答这个问题。

标签: c# .net dictionary datacontractserializer binaryformatter


【解决方案1】:

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

错误 2:几乎一直使用BinaryFormatter...(可能除了AppDomain marshalling)

我的建议:创建一个简单的模型(“DTO”模型),它只代表您需要的数据,但不是根据您的具体实现(没有OCAdapter.OCCamera 等)。您可以以适合您喜欢的任何序列化库的任何方式构建此 DTO 模型。我偏爱 protobuf-net,但还有很多其他的存在。然后映射到/映射到您的 DTO 模型和您的实现模型。

优点:

  • 它会起作用的
  • 对实施的更改不会影响数据;它只会影响映射代码
  • 您可以使用几乎任何您想要的序列化程序
  • 您可以明智地对数据进行版本控制

【讨论】:

  • 感谢您的快速回复。我今晚会处理这个。我必须做一些研究,目前您的解决方案超出了我的想象。
猜你喜欢
  • 2015-05-06
  • 2022-10-12
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
相关资源
最近更新 更多