Thread overview
How to serialize to binary data for TCP/IP communication
Jan 24, 2007
Masterchief
Jan 24, 2007
Bertel Brander
Jan 25, 2007
Masterchief
Jan 25, 2007
Bertel Brander
Jan 26, 2007
Masterchief
Jan 27, 2007
Bertel Brander
Jan 29, 2007
Masterchief
January 24, 2007
Hy!

I am searching a tutorial which shows me how I can serailia a C++ class to binary data to send it over the network and deserialze it at the receiver. Does anyone have an example or link?

Ronny


January 24, 2007
Masterchief skrev:
> Hy!
> 
> I am searching a tutorial which shows me how I can serailia a C++ class to binary data to send it over the network and deserialze it at the receiver.
> Does anyone have an example or link?

If you know what you are doing, you can simply cast a pointer to
an object of the class to a void pointer and send that, using
sizeof to get the size of the object. At the receiver, simply
do the opposite.
But beware of pointers in the class and virtual tables.
Also note that no constructor for the class is called.


If this is not an option, you need to do it by hand.
Either:
1: serialize and deserialize each data member.
2: Describe each class in at text file that can be
converted to a .h file with the class definition and
to functions that can serialize and deserialize the
class.

The first method will do if you have a small number
of classes that do not change frequently.
For the second method you need to develop at tool
that can parse the text files and create the two
output files, that should be easy.

-- 
Just another homepage:
http://damb.dk
But it's mine - Bertel
January 25, 2007
HY!

I tried your suggestion with the cast to void*.
I did this a few days ago, but it failed. But with your hint I could figure
out my error.
I had a char* in my Message class and this caused the error, should mean the
class was not correct assembled at recv.

I´have changed it now to the following members:

class BaseMessage : public DynamicListElement

{

public:

enum MessageType

{

NO_MSG = 0,

BASE_MSG,

UNDEF_MSG

};

BaseMessage();

~BaseMessage();



<SNIP>

private:

//char* mData;

BaseMessageItemList mList;

char mHeader[MESSAGE_HEADER_LENGTH];

static unsigned long mMessageId;

unsigned long mDataLen;

unsigned long mAnswerId;

//char* mSender;

//struct hostent mSender;

char mSender[256];

MessageType mType;

};

BaseMessageItemList is an array of 20 BaseMessageItem s.

Send is done the following way:
BaseMessage *lMess = new BaseMessage();

BaseMessageItem it2;

it2.setId(333);

lMess->addElement(it2);

int ret = send(mSocket,

(const char*)(void*)lMess,

lSize,

MSG_DONTROUTE);


Recv is done the following:

BaseMessage* lRecvMes = new BaseMessage();

int rlen = recv(piSocket,

(char*)(void*)lRecvMes,

sizeof(BaseMessage),

0);

My question now is can I change the BaseMessageItemList to a pointered List?
You´ll quess I´ve already tryed it and it didn´t work:-(
Do you have any suggestions?


Thanks








"Bertel Brander" <bertel@post4.tele.dk> schrieb im Newsbeitrag news:ep8mfp$e4l$1@digitaldaemon.com...
> Masterchief skrev:
>> Hy!
>>
>> I am searching a tutorial which shows me how I can serailia a C++ class
>> to binary data to send it over the network and deserialze it at the
>> receiver.
>> Does anyone have an example or link?
>
> If you know what you are doing, you can simply cast a pointer to
> an object of the class to a void pointer and send that, using
> sizeof to get the size of the object. At the receiver, simply
> do the opposite.
> But beware of pointers in the class and virtual tables.
> Also note that no constructor for the class is called.
>
>
> If this is not an option, you need to do it by hand.
> Either:
> 1: serialize and deserialize each data member.
> 2: Describe each class in at text file that can be
> converted to a .h file with the class definition and
> to functions that can serialize and deserialize the
> class.
>
> The first method will do if you have a small number
> of classes that do not change frequently.
> For the second method you need to develop at tool
> that can parse the text files and create the two
> output files, that should be easy.
>
> -- 
> Just another homepage:
> http://damb.dk
> But it's mine - Bertel


January 25, 2007
Masterchief skrev:
> HY!
> 
> I tried your suggestion with the cast to void*.
> I did this a few days ago, but it failed. But with your hint I could figure out my error.
> I had a char* in my Message class and this caused the error, should mean the class was not correct assembled at recv.
> 
> I´have changed it now to the following members:
> 
> class BaseMessage : public DynamicListElement
> 
> {
> 
> public:
> 
> enum MessageType
> 
> {
> 
> NO_MSG = 0,
> 
> BASE_MSG,
> 
> UNDEF_MSG
> 
> };
> 
> BaseMessage();
> 
> ~BaseMessage();
> 
> 
> 
> <SNIP>
> 
> private:
> 
> //char* mData;
> 
> BaseMessageItemList mList;
> 
> char mHeader[MESSAGE_HEADER_LENGTH];
> 
> static unsigned long mMessageId;
> 
> unsigned long mDataLen;
> 
> unsigned long mAnswerId;
> 
> //char* mSender;
> 
> //struct hostent mSender;
> 
> char mSender[256];
> 
> MessageType mType;
> 
> };
> 
> BaseMessageItemList is an array of 20 BaseMessageItem s.
> 
> Send is done the following way:
> BaseMessage *lMess = new BaseMessage();
> 
> BaseMessageItem it2;
> 
> it2.setId(333);
> 
> lMess->addElement(it2);
> 
> int ret = send(mSocket,
> 
> (const char*)(void*)lMess,
> 
> lSize,
> 
> MSG_DONTROUTE);
> 
> 
> Recv is done the following:
> 
> BaseMessage* lRecvMes = new BaseMessage();
> 
> int rlen = recv(piSocket,
> 
> (char*)(void*)lRecvMes,
> 
> sizeof(BaseMessage),
> 
> 0);
> 
> My question now is can I change the BaseMessageItemList to a pointered List?
> You´ll quess I´ve already tryed it and it didn´t work:-(
> Do you have any suggestions?

What is the type of BaseMessageItemList?
If it is a simple array, it should work.

What is DynamicListElement?

The "static unsigned long mMessageId;" could be a problem.

-- 
Just another homepage:
http://damb.dk
But it's mine - Bertel
January 26, 2007
Hy!

<SNIP>

>>
>> My question now is can I change the BaseMessageItemList to a pointered
>> List?
>> You´ll quess I´ve already tryed it and it didn´t work:-(
>> Do you have any suggestions?
>
> What is the type of BaseMessageItemList?
> If it is a simple array, it should work.

This is exactly the point. Usually it was an Pointer List => didn´t work. Then I changed it to an array  => works fine

> What is DynamicListElement?

Is a generic class. Actually it was an item of the pointer list now its just
a class where I can store data:
class BaseMessageItem

{

public:

BaseMessageItem();

~BaseMessageItem();

int getId()

{

return mMTXId;

}

void setId(int piId)

{

mMTXId = piId;

}

private:

int mMTXId;

};

But this is the point I want to solve. I wanted to use a poiter list in my message class.
> The "static unsigned long mMessageId;" could be a problem.
With the static Message ID I don´t have any problems.
What could be the problem you think?

Thanks

>
> -- 
> Just another homepage:
> http://damb.dk
> But it's mine - Bertel


January 27, 2007
Masterchief skrev:
> Hy!
> 
> <SNIP>
> 
>>> My question now is can I change the BaseMessageItemList to a pointered List?
>>> You´ll quess I´ve already tryed it and it didn´t work:-(
>>> Do you have any suggestions?
>> What is the type of BaseMessageItemList?
>> If it is a simple array, it should work.
> 
> This is exactly the point. Usually it was an Pointer List => didn´t work.
> Then I changed it to an array  => works fine

I have done an attempt to do it in another way.
Here you declare the class as:

CLASS(SomeClass)
   DECLARE(int, x)
   DECLARE_ARRAY(20, int, array)
   DECLARE_POINTER(len, ptr, short)
END_CLASS

The preprocessor will translate it into tree things.
First the class:
class SomeClass
{
public:
   bool Deserialize(Deserializer& ser);
   bool Serialize(Serializer& ser) const;
   int x;
   int array[20];
   int len;
   short* ptr;
};

The preprocessor will also create the two functions
Serialize and Deserialize for you.

The len parameter specifies the number of elements in ptr.

I have put everything in a .zip file:
http://damb.dk/zip/serialize.zip

-- 
Just another homepage:
http://damb.dk
But it's mine - Bertel
January 29, 2007
Thanks a lot!


"Bertel Brander" <bertel@post4.tele.dk> schrieb im Newsbeitrag news:epgk1l$2ivg$1@digitaldaemon.com...
> Masterchief skrev:
>> Hy!
>>
>> <SNIP>
>>
>>>> My question now is can I change the BaseMessageItemList to a pointered
>>>> List?
>>>> You´ll quess I´ve already tryed it and it didn´t work:-(
>>>> Do you have any suggestions?
>>> What is the type of BaseMessageItemList?
>>> If it is a simple array, it should work.
>>
>> This is exactly the point. Usually it was an Pointer List => didn´t work. Then I changed it to an array  => works fine
>
> I have done an attempt to do it in another way.
> Here you declare the class as:
>
> CLASS(SomeClass)
>    DECLARE(int, x)
>    DECLARE_ARRAY(20, int, array)
>    DECLARE_POINTER(len, ptr, short)
> END_CLASS
>
> The preprocessor will translate it into tree things.
> First the class:
> class SomeClass
> {
> public:
>    bool Deserialize(Deserializer& ser);
>    bool Serialize(Serializer& ser) const;
>    int x;
>    int array[20];
>    int len;
>    short* ptr;
> };
>
> The preprocessor will also create the two functions Serialize and Deserialize for you.
>
> The len parameter specifies the number of elements in ptr.
>
> I have put everything in a .zip file: http://damb.dk/zip/serialize.zip
>
> -- 
> Just another homepage:
> http://damb.dk
> But it's mine - Bertel