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

时间:2010-03-02 15:06:53

标签: c# c++ serialization

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

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

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

提前致谢。 Roey。

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

7 个答案:

答案 0 :(得分:7)

如果您使用BinaryFormatter,则几乎不可能。不要去那里......

协议缓冲区设计是可移植的,跨平台和版本容忍的(因此在添加新字段时不会爆炸)。谷歌提供C ++版本,有几个免费提供的C#版本(包括我自己的版本) - see here for the full list

小巧,快速,轻松。

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

答案 1 :(得分:6)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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

对于C ++ XML库,最有能力(也许也是最复杂的)似乎仍然是Xerces library。但你应该自己决定which library best fits your needs and skills

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

使用XML序列化是最好的方法,实际上是最简洁的方法。

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