• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 3911
  • Last Modified:

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
0
choo_chu
Asked:
choo_chu
  • 4
  • 2
1 Solution
 
Ravi SinghSenior Software EngineerCommented:
Hi, do you want to write the object out to disk and then later read it back in? I think your refering to serialization, this article gives a good explanation using the BinaryFormatter class:

http://www.codeproject.com/csharp/objserial.asp
0
 
choo_chuAuthor Commented:
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
0
 
yotamsherCommented:
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
0
What Kind of Coding Program is Right for You?

There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.

 
choo_chuAuthor Commented:
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
0
 
yotamsherCommented:
Hey choo_chu
my gfeeling, is that you should be going in the direction of serialization, as offered by  Zephyr__
  )-:
but look at this article
    http://www.codeguru.com/csharp/csharp/cs_syntax/reflection/article.php/c5885/
it might give you a hint to a different road:

Yotam
0
 
choo_chuAuthor Commented:
Thanks for the article Yotam...I think that will help a lot.  I'll keep you posted.

choo_chu
0
 
choo_chuAuthor Commented:
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
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

What Kind of Coding Program is Right for You?

There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.

  • 4
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now