Write Object Array to Binary File

I have created a multidimensional object array (Holds a heap).  The following are the data types for each node:
All the data in column 0 = string
All the data in column 1 = long int
All the data in column 2 = string
All the data in column 3 = float
All the data in column 4 = int

I want to now place this whole array into a binary text file.  Below is the code that i have produced to write the data to the binary file.  When i run the program i receive an error saying it can't convert from object to bool.  What am i doing wrong?  Is there a better way to do this?
static void SaveHeap()// called by Main
        {
            BinaryWriter HeapInput = new BinaryWriter(new FileStream("HeapFile.txt", FileMode.OpenOrCreate));
 
            HeapInput.Write(N);
 
            for (int i = 1; i <= N; i++)
            {
                for (int j = 1; j <= 4; j++)
                {
                    HeapInput.Write(HeapHold[i, j]);
                }
            }
 
            HeapInput.Flush();
            HeapInput.Close();
 
            WriteToLog.WriteLine("*SaveHeap done - Heap has {0} nodes", N.ToString("d2"));
            WriteToLog.WriteLine();
        }

Open in new window

jmkotmanAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

JimBrandleyCommented:
BinaryWriter.Write() does not have an overload that takes an object. So,  try this:

for (int i = 1; i <= N; i++)
{
   HeapInput.Write((string)HeapHold[i, 0]);
   HeapInput.Write((long)HeapHold[i, 1]);
   HeapInput.Write((string)HeapHold[i, 2]);
   HeapInput.Write((float)HeapHold[i, 3]);
   HeapInput.Write((int)HeapHold[i, 4]);
}

Also, did you intend to skip the first entry in the array? It is:
for (int i = 1; i <= N; i++)

but I would expect:
for (int i = 0; i < N; i++)

Jim
0
ericwong27Commented:
Maybe the Serializes Technique is a better solution
using System;
using System.IO;
using System.Collections;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
 
public class App 
{
    [STAThread]
    static void Main() 
    {
        Serialize();
        Deserialize();
    }
 
    static void Serialize() 
    {
        // Create a hashtable of values that will eventually be serialized.
        Hashtable addresses = new Hashtable();
        addresses.Add("Jeff", "123 Main Street, Redmond, WA 98052");
        addresses.Add("Fred", "987 Pine Road, Phila., PA 19116");
        addresses.Add("Mary", "PO Box 112233, Palo Alto, CA 94301");
 
        // To serialize the hashtable and its key/value pairs,  
        // you must first open a stream for writing. 
        // In this case, use a file stream.
        FileStream fs = new FileStream("DataFile.dat", FileMode.Create);
 
        // Construct a BinaryFormatter and use it to serialize the data to the stream.
        BinaryFormatter formatter = new BinaryFormatter();
        try 
        {
            formatter.Serialize(fs, addresses);
        }
        catch (SerializationException e) 
        {
            Console.WriteLine("Failed to serialize. Reason: " + e.Message);
            throw;
        }
        finally 
        {
            fs.Close();
        }
    }
 
   
    static void Deserialize() 
    {
        // Declare the hashtable reference.
        Hashtable addresses  = null;
 
        // Open the file containing the data that you want to deserialize.
        FileStream fs = new FileStream("DataFile.dat", FileMode.Open);
        try 
        {
            BinaryFormatter formatter = new BinaryFormatter();
 
            // Deserialize the hashtable from the file and 
            // assign the reference to the local variable.
            addresses = (Hashtable) formatter.Deserialize(fs);
        }
        catch (SerializationException e) 
        {
            Console.WriteLine("Failed to deserialize. Reason: " + e.Message);
            throw;
        }
        finally 
        {
            fs.Close();
        }
 
        // To prove that the table deserialized correctly, 
        // display the key/value pairs.
        foreach (DictionaryEntry de in addresses) 
        {
            Console.WriteLine("{0} lives at {1}.", de.Key, de.Value);
        }
    }
}

Open in new window

0
jmkotmanAuthor Commented:
Jim,
Your solution seemed to work wonderfully.  I am now going to write another method to read in those files.  Below is the code i have written.  Is there a better way to read in that binary file?  Can i read it in the same way i output it?
static void Main(string[] args)
        {
            int N = 0;
            string titleCode = "";
            long isbn;
            string title = "";
            float price;
            int localID = 0;
 
            BinaryReader HeapInput = new BinaryReader(new FileStream("C:\\Users\\Ryan\\Documents\\Visual Studio 2005\\Projects\\Assignment_2\\Assignment_2\\bin\\Debug\\HeapFile.txt", FileMode.Open));
 
            if(N == 0)
            {
                N = HeapInput.ReadInt32();
            }
 
            WriteToLog.WriteLine("*Dump of the HeapFile: N = {0}", N.ToString("d2"));
 
            for (int i = 1; i <= N ; i++)
            {
                titleCode = (string)HeapInput.Read();
                isbn = (long)HeapInput.Read();
                title = (string)HeapInput.Read();
                price = (float)HeapInput.Read();
                localID = (int)HeapInput.Read();
 
                WriteToLog.WriteLine("{0} // {1} {2} {3} {4} {5}");
            }
 
            WriteToLog.WriteLine();
            WriteToLog.WriteLine();
        }

Open in new window

0
JimBrandleyCommented:
I don't think that will work. Try this instead:

            for (int i = 1; i <= N ; i++)
            {
                titleCode = HeapInput.ReadString();
                isbn = HeapInput.ReadInt64();
                title = HeapInput.ReadString();
                price = HeapInput.ReadSingle();
                localID = HeapInput.ReadInt32();
            }

Jim
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C#

From novice to tech pro — start learning today.