2013-10-02 156 views
2

因此,这里是背景: 我们有一个传统程序,用C++编写数据日志。数据包含在不同的结构中。读取日志文件的程序使用那些相同的结构来显示数据。我重写了读取日志文件和C#的程序,并且必须手动创建所有这些结构的C#副本。 有没有更好的方法来做到这一点?我曾考虑过建立一个查找路径到结构和一种解析器,它可以在构建时生成一个C#结构,但对于处理所有特殊情况来说似乎过于复杂。有没有建议要这样做? C#没有任何向后兼容性来处理C/C++结构似乎有些荒谬。在构建时将C++结构转换为C#结构

回答

1

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

这是一个成本vs收益问题我会说。我敢打赌,从你的问题来看,只需快速编写C#中的结构是最好的方法。

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

+0

有更多的结构比我想想的。有很多。问题是,如果开发人员更改C++结构,则他们必须更改C#结构。如果他们不那么我们只是默认显示十六进制数据。如果它恰好是一个不经常使用的消息,那么直到软件发布后我们才可能知道。 – Jason

+0

如果这是一个内部项目,您当然可以与开发团队协调,为您提供一个C#版本的结构,只要他们改变它们...... –

0

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

您需要的是一个Interface Definition Language (IDL),您可以在其中以独立于语言的方式描述数据。类似于Apache Thrift,Google 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. 我提到的第三方库是强大的并且被广泛使用。比自己偷偷摸摸什么都好。