在C++中序列化,然后在C#中反序列化?

12

有没有一种简单的方法在C++中将数据序列化(转换为xml或二进制格式),然后在C#中反序列化该数据?

我正在使用一些无法运行.NET的远程WINNT机器。我的服务器应用程序完全是用C#编写的,因此我想要一种简单的方法来共享简单的数据(大多数是键值对,可能还包括SQL结果集的表示)。我认为最好的方法是在客户端以某个预定义格式将数据写入xml文件,将xml文件传输到我的服务器,并由C#包装器将xml读入可用的c#对象中。

客户端和服务器通过tcp连接通信,我真正想要的是在客户端内存中序列化数据,将二进制数据通过套接字传输到C#内存流中,以便我可以将其反序列化为c#对象(消除文件创建、传输等),但我不认为存在这样的东西。欢迎给我指点。

编辑

我知道我可以在C++应用程序中创建结构体并在C#中定义它们,然后以这种方式传输数据,但在我看来,这感觉像是我限制了可以发送的内容。我必须为对象设置预定义大小等。

6个回答

8

Protocol Buffers 对您可能很有用。

协议缓冲区是谷歌的语言中立、平台中立、可扩展的序列化结构化数据机制 - 想象一下 XML,但更小、更快、更简单。您只需定义一次要结构化数据的方式,然后就可以使用特殊生成的源代码轻松地将结构化数据编写和读取到各种数据流中,并使用各种语言 - Java、C++ 或 Python。

.NET 端口可从Marc GravellJon Skeet获得。


看起来很有用,我想序列化的数据只是JSON?看起来是这样的。 - scottm
不,它是二进制的。请参见http://code.google.com/apis/protocolbuffers/docs/encoding.html。 - Michael Myers

2

我看了所有提到的项目,如protocol buffers、json、xml等,但在发现BSON之后,我选择使用它,原因如下:

  • 易于使用的API
  • 有多种语言实现(C、C++、Haskell、Go、Erlang、Perl、PHP、Python、Ruby、C#等)
  • 二进制格式,因此非常节省空间且速度快(较少的字节->较短的时间)
  • 跨平台一致性(没有大小端等问题)
  • 分层结构。数据模型类似于json(名字所示),因此大多数数据建模任务都应该可以解决。
  • 不需要预编译器
  • 被广泛使用(Mongodb、许多语言)

现在我也会考虑使用Flatbuffers,尽管它需要一个预编译器。 - schoetbi

0

C++没有结构内省(无法在运行时找到类的字段),因此没有通用机制来编写C++对象。您可以采用约定并使用代码生成,或者(更常见的是)自己编写序列化。

有一些针对标准格式(如ASN.1、HDF5等)的库,它们是实现语言中立的。还有专有库可以实现同样的目的(例如协议缓冲区)。

如果您的目标架构和编译器,则可以将C++对象转储为原始字节,并在C#端创建解析器。

究竟哪种方法更好取决于您希望端点紧密耦合的程度以及数据主要是数值(HDF5)、树和序列结构(ASN.1)还是简单的纯数据对象(直接将值写入内存)。


0

其他选项可能包括:

  • 创建一个二进制文件,以您需要的方式包含数据(不是易于移植的解决方案)

  • XML

  • YAML

  • 纯文本文件


0

你可以选择很多选项。命名管道、共享内存、DDE、远程调用... 取决于你的具体需求。

快速搜索得到以下结果:

命名管道

共享内存

DDE


0

如前所述, Protocol Buffers是一个不错的选择。

如果这个选项不适合您的需求,那么我建议将XML发送到客户端(您需要在消息前加上长度以便知道要读取多少),然后使用IXmlSerializer的实现或使用DataContract/DataMember属性与DataContractSerializer结合使用,在.NET中获取您的表示。

我建议不要使用马歇尔属性,因为它们不支持像List<T>和许多其他标准.NET类一样的东西,这些类通常会被使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接