【问题标题】:Serialize in C++ then deserialize in C#?在 C++ 中序列化然后在 C# 中反序列化?
【发布时间】:2010-10-18 02:31:39
【问题描述】:

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

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

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

编辑

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

【问题讨论】:

    标签: c# c++ serialization


    【解决方案1】:

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

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

    【讨论】:

    • 现在我也会考虑Flatbuffers 虽然它需要一个预编译器
    【解决方案2】:

    Protocol Buffers 可能对你有用。

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

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

    【讨论】:

    【解决方案3】:

    As mentioned already,Protocol Buffers 是一个不错的选择。

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

    我建议不要使用封送处理属性,因为它们不受诸如 List<T> 之类的东西以及您通常会使用的许多其他标准 .NET 类的支持。

    【讨论】:

      【解决方案4】:

      有很多选项可供您选择。命名管道,共享 内存、DDE、远程处理...取决于您的特定需求。

      快速谷歌搜索给出了以下信息:

      Named pipes

      Named Shared Memory

      DDE

      【讨论】:

        【解决方案5】:

        其他选项是:

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

        • XML

        • YAML

        • 纯文本文件

        【讨论】:

          【解决方案6】:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 2011-01-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-02
            • 1970-01-01
            相关资源
            最近更新 更多