choo_chu
asked on
object to byte[] in c#
Hi All!
I'm working with c# and would like to put an object type into a byte[]. I found some documentation on how to put a struct into a buffer and how to dynamically allocate memory to copy a void* to another void*, but not how to copy an object into a buffer. I also looked at MemoryStream and BitConverter. If anyone has any ideas, I'm more than happy to hear them!
Thanks!
choo_chu
I'm working with c# and would like to put an object type into a byte[]. I found some documentation on how to put a struct into a buffer and how to dynamically allocate memory to copy a void* to another void*, but not how to copy an object into a buffer. I also looked at MemoryStream and BitConverter. If anyone has any ideas, I'm more than happy to hear them!
Thanks!
choo_chu
ASKER
I have looked at the BinaryFormatter, but I'm not looking for serialization because I don't need all the extra information that is needed to reproduce the class when it's deserialized. I just need the data. (Notice that sizeof() and the amount of bytes used to serialize and object aren't the same.) In c++, what I'm looking for would be akin to memcpy().
Thanks!
choo_chu
Thanks!
choo_chu
Hey choo_chu
what does your class look like?
I got the feeling, that it is more like a struct, can't you just write a ToByteArray and FromByteArray functions?
why do you need to memcpy? are you then transfering it somewhere?
the more details you give, the better answers you'll get
Yotam
what does your class look like?
I got the feeling, that it is more like a struct, can't you just write a ToByteArray and FromByteArray functions?
why do you need to memcpy? are you then transfering it somewhere?
the more details you give, the better answers you'll get
Yotam
ASKER
Hi,
I won't know what the incoming object looks like, I will only know its size. The constructor has the following definition:
DBObject( object obj, int size )
The class DBObject is the class of objects that are in the nodes of a b-tree. The class contains two data members, _size and _data. The constructor will set values _size = size and _data = obj...I want to be able to copy obj into _data, which is a byte[]. The data in this object (_size and _data) will be written to file and later retrieved.
Thanks!
choo_chu
I won't know what the incoming object looks like, I will only know its size. The constructor has the following definition:
DBObject( object obj, int size )
The class DBObject is the class of objects that are in the nodes of a b-tree. The class contains two data members, _size and _data. The constructor will set values _size = size and _data = obj...I want to be able to copy obj into _data, which is a byte[]. The data in this object (_size and _data) will be written to file and later retrieved.
Thanks!
choo_chu
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks for the article Yotam...I think that will help a lot. I'll keep you posted.
choo_chu
choo_chu
ASKER
Ok, I figured out how to do what I want using reflection...it's actually kinda neat ;) This isn't all the code, but is the jist of what I did. I got the field type, and I stuff the values into the byte[] using BitConverter.GetBytes(). When I get to the byte[] type, I just use the GetValue() supplied by the FieldInfo. Mind you this is test code, so it doesn't pay attention to where in the byte[] it is putting things, it is just over writing previous values. It is just so I could see whether this idea would actually work.
// copy to byte[]
switch( fieldType )
{
case( "System.Int32" ): // int or long
if( fi[c].Name.ToString() == "_size" )
{
size = (int)fi[c].GetValue( obj );
}
_data = BitConverter.GetBytes( size );
break;
case( "System.Int64" ):
_data = BitConverter.GetBytes( (long)fi[c].GetValue( obj ) );
break;
case( "System.Boolean" ):
_data = BitConverter.GetBytes( (bool)fi[c].GetValue( obj ) );
break;
:
:
Thanks a lot for your input!
choo_chu
// copy to byte[]
switch( fieldType )
{
case( "System.Int32" ): // int or long
if( fi[c].Name.ToString() == "_size" )
{
size = (int)fi[c].GetValue( obj );
}
_data = BitConverter.GetBytes( size );
break;
case( "System.Int64" ):
_data = BitConverter.GetBytes( (long)fi[c].GetValue( obj ) );
break;
case( "System.Boolean" ):
_data = BitConverter.GetBytes( (bool)fi[c].GetValue( obj ) );
break;
:
:
Thanks a lot for your input!
choo_chu
http://www.codeproject.com/csharp/objserial.asp