Link to home
Start Free TrialLog in
Avatar of jmkotman
jmkotmanFlag for United States of America

asked on

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

Avatar of JimBrandley
JimBrandley
Flag of United States of America image

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
Avatar of ericwong27
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

Avatar of jmkotman

ASKER

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

ASKER CERTIFIED SOLUTION
Avatar of JimBrandley
JimBrandley
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial