2

所以这是背景:我们有一个用 C++ 编写数据日志的遗留程序。数据包含在不同的结构中。读取日志文件的程序使用这些相同的结构来显示数据。我重写了读取日志文件和 C# 的程序,并且必须手动创建所有这些结构的 C# 副本。有一个更好的方法吗?我考虑过设置结构的查找路径和一种在构建时生成 C# 结构的解析器,但处理所有特殊情况似乎过于复杂。有什么建议吗?C# 没有任何向后兼容性来处理 C/C++ 结构似乎有点荒谬。

4

2 回答 2

1

有多少结构,它们有多复杂?

这是我要说的成本与收益的问题。我敢打赌,从你的问题来看,在 C# 中快速编码结构是最好的方法。

只是我的 2 美分,税前...

于 2013-10-02T13:08:09.667 回答
0

您的问题摘要:您在序列化到磁盘的现有 C++ 程序中有大量结构。您希望将结构移植到 C#,以便可以将磁盘中的数据反序列化到 C# 程序中。你不想只做一次。随着两个程序的发展,您希望使两组结构保持同步。

您需要的是一种接口定义语言 (IDL),您可以在其中以独立于语言的方式描述您的数据。Apache ThriftGoogle Protocol BuffersMessagePack 之类的东西。

您必须采取的步骤是:

  1. 将现有的 C++ 结构转换为 IDL。这是一个一次性的过程。使用自定义脚本或查找现有脚本。现在一定有人解决了这个问题。
  2. 设置您的构建系统以在构建时生成 C# 和 C++ 定义。
  3. 使用 Thrift/ProtoBuf/MessagePack C# 和 C++ API 根据需要对数据进行序列化和反序列化。

缺点是:

  1. 您需要构建时代码生成。但是您自己已经考虑到了这一点,并且这种方式已经为您完成了工作。
  2. 您必须同时更改 C++ 和 C# 才能正确使用为您生成的任何数据结构。
  3. 磁盘格式的二进制文件将更改,因此旧日志将无法读取。但是您可以编写一些 C++ 来轻松地将它们转换为新格式。

我认为这被优势所抵消:

  1. IDL 将包含您的数据的规范描述。对它的任何更改都将反映在您的 C++ 和 C# 中。当 C++ 更改时,您不必手动更新 C# 版本。
  2. 二进制数据格式将与机器无关。您将能够在各种平台上从多种不同语言读取/写入数据。
  3. 我提到的第三方库很健壮并且被广泛使用。比自己破解一些东西要好。
于 2013-10-02T13:41:48.443 回答