Question

I want to deserialize in a generic SortedList, just like this example with the hashtable

http://msdn.microsoft.com/es-es/library/system.runtime.serialization.formatters.binary.binaryformatter(v=vs.80).aspx

But in this line

collectionContacts = (SortedList<string,Contact>) formatter.Deserialize(fs);

I´m obtaining an InvalidCastException, How can I fixed? and why?

collectionContacts is a SortedList<string,Contact>,
fs is FileStream fs = new FileStream("DataFile.dat", FileMode.Open)

and formatter is a BinaryFormatter object

Was it helpful?

Solution

Although it does not implement the Interface ISerializable it seems o be serializable (and it has the [SerializableAttribute]) Trying to run the code im ny machine shows that the Sortedlist is actually serializable, guess the castexception should be because of the generic parameters.

The code i tested is as follow:

Serialize

private static void Serialize() 
{
    // Create a hashtable of values that will eventually be serialized.
    SortedList<string, string> addresses = new SortedList<string, string>();
    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(@"C:data.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();
    }
}

Deserialize

private static void Deserialize() 
{ 
    // Declare the hashtable reference.
    SortedList<string, string> addresses = null;

    // Open the file containing the data that you want to deserialize.
    FileStream fs = new FileStream(@"C:data.dat", 
        FileMode.Open);
    try 
    {
        BinaryFormatter formatter = new BinaryFormatter();

        // Deserialize the hashtable from the file and 
        // assign the reference to the local variable.
        addresses = (SortedList<string, string>) 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 (var de in addresses) 
    {
        Console.WriteLine("{0} lives at {1}.", de.Key, de.Value);
    }
    Console.ReadLine();
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top