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

时间:2009-04-07 15:45:29

标签: c# c++ serialization

有没有一种简单的方法可以用c ++(xml或二进制)序列化数据,然后在C#中反序列化数据?

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

客户端和服务器通过tcp连接进行通信,我真正想要的是将客户端内存中的数据序列化,通过套接字将二进制数据传输到ac#内存流,我可以将其反序列化为ac#对象(消除文件创建,传输等),但我不认为存在这样的事情。随意赐教。

修改

我知道我可以在c ++应用程序中创建一个结构并在c#中定义它并以这种方式传输数据,但在我的脑海中,感觉就像我限制了可以发送的内容。我必须为对象等设置预定义的大小

7 个答案:

答案 0 :(得分:8)

Protocol Buffers可能对您有用。

  

协议缓冲区是Google用于序列化结构化数据的语言中立,平台中立,可扩展的机制 - 思考XML,但更小,更快,更简单。您可以定义数据的结构化时间,然后可以使用特殊生成的源代码轻松地在各种数据流中使用各种语言(Java,C ++或Python)编写和读取结构化数据。

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

答案 1 :(得分:2)

我检查了所有提到的项目,如prottocol缓冲区,json,xml等,但在找到BSON之后我使用了这个,原因如下:

  • 易于使用的API
  • 适用于许多languages(C,C ++,Haskell,Go,Erlang,Perl,PHP,Python,Ruby,C#,......)
  • 二进制因此非常节省空间和快速(少字节 - >更少时间)
  • 在平台上保持一致(没有endianess等问题)
  • 分层。数据模型与json(顾名思义)相当,因此大多数数据建模任务都应该是可解决的。
  • 无需预编译器
  • wideley使用(Mongodb,多种语言)

答案 2 :(得分:1)

WCF是用于序列化数据的.NET框架解决方案,看起来这个链接找出了如何使用c ++中的数据,这与你想要的方向相反,但可能有一个简单的模拟用于反转。 / p>

http://geekswithblogs.net/cicorias/archive/2007/08/28/Consuming-WCF-Services-from-COM-using-C.aspx

答案 3 :(得分:0)

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

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

如果您的目标是特定的体系结构和编译器,那么您也可以将C ++对象转储为原始字节,并在C#端创建解析器。

更好的方法取决于您希望端点的耦合程度,以及数据主要是数字(HDF5),树和序列结构(ASN.1),还是简单的普通数据对象(直接写入值)存储器)

答案 4 :(得分:0)

其他选择是:

  • 以您需要的方式创建包含数据的二进制文件 (不是简单易用的便携式解决方案)

  • XML

  • YAML

  • 纯文本文件

答案 5 :(得分:0)

As mentioned already,协议缓冲区是一个不错的选择。

如果该选项不符合您的需求,那么我会考虑将XML发送到客户端(您必须在消息前加上长度以便知道要阅读多少),然后使用IXmlSerializer或将DataContract / DataMember属性与DataContractSerializer结合使用,以获得在.NET中的表示。

我建议不要使用编组属性,因为List<T>和许多其他常用的标准.NET类都不支持它们。

答案 6 :(得分:-1)

您可以选择许多选项。命名管道,共享 记忆,DDE,远程...取决于你的特殊需要。

快速谷歌搜索给出了以下内容:

Named pipes

Named Shared Memory

DDE