在.NET中序列化,在C ++中反序列化

我有一个.NET应用程序,它以二进制格式序列化对象。 这个对象是一个由几个字段组成的结构。

我必须在C ++应用程序中反序列化并使用此对象。 我不知道是否有任何C ++序列化库,谷歌搜索没有太多。

实现这一目标的最快方法是什么?

提前致谢。 Roey。

更新:我已经在我的.NET应用程序中使用Protobuf-net进行了序列化,相对容易。 我还使用GetProto()命令获取protobuf-net生成的.proto文件。 在.proto文件中,我的GUID字段得到一种类型“bcl.guid”,但C ++ protoc.exe编译器不知道如何解释它们! 我该怎么办?

如果您使用的是BinaryFormatter ,那么它几乎是不可能的。 不要去那里……

协议缓冲区设计为可移植,跨平台和版本容忍(因此在添加新字段时不会爆炸)。 谷歌提供C ++版本,有几个免费提供的C#版本(包括我自己的版本) – 请参阅此处查看完整列表 。

小巧,快速,简单。

请注意,protobuf-net的v1不会直接处理结构(你需要一个DTO类),但v2(很快) 确实测试了结构支持。

你能编辑.NET应用程序吗? 如果是这样,为什么不使用XML Serialization以易于导入的格式输出数据?

boost和Google都有序列化库。 但是,如果你的结构非常简单,你可以考虑通过从C#写出字节然后用fread读取C ++中的数据来自己管理序列化。

同意他人。 这样做会使您的应用非常容易受到攻击。 如果您正在序列化的某个类以任何方式更改或构建在更高版本的C#编译器上,请考虑这种情况:您的序列化类可能会发生更改,从而导致它们无法读取。

基于XML的解决方案可能运行良好。 你考虑过SOAP吗? 现在有点过时了,但值得一看。 主要问题是将实现与数据分离。 如果速度/效率是一个问题,你可以用二进制文件做到这一点,尽管根据我的经验,它很少。

以二进制格式进行序列化并期望使用另一种语言的应用程序来读取二进制文件是一个非常脆弱的解决方案(即,它将倾向于打破对任何事物的最小变化)。

以通用标准格式序列化数据会更稳定。

您可以选择更改格式吗? 如果是这样,请考虑选择非二进制格式以实现更高的互操作性。 有许多用于读写XML的库。 Json也很受欢迎。

二进制格式是高效的,但容易受到实现细节的影响(C ++编译器是否包含数据结构?如何表示整数和浮点数?使用了什么字节顺序?),如果损坏则难以调整。 基于文本的格式很冗长,但往往更加健壮。 如果您不确定二进制表示,文本表示往往更容易理解(除了代码页和宽/窄字符等挑战)。

对于C ++ XML库,最有能力(也许也可能是最复杂的)似乎仍然是Xerces库 。 但是你应该自己决定哪个库最适合你的需求和技能 。

使用XML Serialization是最好的方式,实际上是最干净的方法。

 XmlSerializer s = new XmlSerializer( typeof( YourClassType ) ); TextWriter w = new StreamWriter( @"c:\list.xml" ); s.Serialize( w, yourClassListCollection ); w.Close();