Roey
Roey

Reputation: 391

serialize in .NET, deserialize in C++

I have a .NET application which serializes an object in binary format. this object is a struct consisting of a few fields.

I must deserialize and use this object in a C++ application. I have no idea if there are any serialization libraries for C++, a google search hasn't turned up much.

What is the quickest way to accomplish this?

Thanks in advance. Roey.

Update : I have serialized using Protobuf-net , in my .NET application, with relative ease. I also get the .proto file that protobuf-net generated, using GetProto() command. In the .proto file, my GUID fields get a type of "bcl.guid", but C++ protoc.exe compiler does not know how to interpret them! What do I do with this?

Upvotes: 12

Views: 8192

Answers (7)

Michael D. Irizarry
Michael D. Irizarry

Reputation: 6302

Use XML Serialization its the best way to go, in fact is the cleanest way to go.

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

Upvotes: 0

Marc Gravell
Marc Gravell

Reputation: 1064044

If you are using BinaryFormatter, then it will be virtually impossible. Don't go there...

Protocol buffers is designed to be portable, cross platform and version-tolerant (so it won't explode when you add new fields etc). Google provide the C++ version, and there are several C# versions freely available (including my own) - see here for the full list.

Small, fast, easy.

Note that the v1 of protobuf-net won't handle structs directly (you'll need a DTO class), but v2 (very soon) does have tested struct support.

Upvotes: 8

Pontus Gagge
Pontus Gagge

Reputation: 17278

Do you have the option of changing the format? If so, consider choosing a non-binary format for greater interoperability. There are plenty of libraries for reading and writing XML. Json is popular as well.

Binary formats are efficient, but vulnerable to implementation details (does your C++ compiler pack data structures? how are ints and floats represented? what byte ordering is used?), and difficult to adjust if mangled. Text based formats are verbose, but tend to be much more robust. If you are uncertain about binary representations, text representations tend to be easier to understand (apart from challenges such as code pages and wide/narrow characters...).

For C++ XML libraries, the most capable (and perhaps also most complex) would still seem to be the Xerces library. But you should decide for yourself which library best fits your needs and skills.

Upvotes: 0

Component 10
Component 10

Reputation: 10507

Agree with others. You are making your app very vulnerable by doing this. Consider the situation if one of the classes you're serializing is changed in any way or built on a later version of the C# compiler: Your serialized classes could potentially change causing them to be unreadable.

An XML based solution might work well. Have you considered SOAP? A little out of fashion now but worth a look. The main issue is to decouple the implementation from the data. You can do this in binary if speed / efficiency is an issue, although in my experience, it rarely is.

Upvotes: 1

Loki Astari
Loki Astari

Reputation: 264669

Serializing in a binary format and expecting an application in another language to read the binary is a very brittle solution (ie it will tend to break on the smallest change to anything).

It would be more stable to serialize the data in a common standard format.

Upvotes: 0

jamone
jamone

Reputation: 17419

Can you edit the .NET app? If so why not use XML Serialization to output the data in a easy to import format?

Upvotes: 7

Eric
Eric

Reputation: 6446

Both boost and Google have libraries for serialization. However, if your struct is pretty trivial, you might consider managing the serialization yourself by writing bytes out from C# and then reading the data in C++ with fread.

Upvotes: 1

Related Questions