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


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

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

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

编辑

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


9820
2018-04-07 15:45


起源



答案:


协议缓冲区 可能对你有用。

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

.NET端口可从 马克格拉维尔 和 Jon Skeet


8
2018-04-07 15:48



看起来很有用,我猜序列化数据只是JSON?这就是它的样子。 - scottm
不,这是二进制的。看到 code.google.com/apis/protocolbuffers/docs/encoding.html。 - Michael Myers♦
这就是我要检查的内容。谢谢! - scottm


答案:


协议缓冲区 可能对你有用。

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

.NET端口可从 马克格拉维尔 和 Jon Skeet


8
2018-04-07 15:48



看起来很有用,我猜序列化数据只是JSON?这就是它的样子。 - scottm
不,这是二进制的。看到 code.google.com/apis/protocolbuffers/docs/encoding.html。 - Michael Myers♦
这就是我要检查的内容。谢谢! - scottm


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

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

2
2017-12-20 09:39



如今我也会考虑 Flatbuffers 虽然它需要一个预编译器 - schoetbi


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

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


1
2018-04-08 22:27





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

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

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

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


0
2018-04-07 15:53





其他选择是:

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

  • XML

  • YAML

  • 纯文本文件


0
2018-04-07 15:54





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

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

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


0
2018-04-07 15:55





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

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

命名管道

命名共享内存

DDE


-1
2018-04-07 15:55