deserealize到通用的sortedlist C#

时间:2013-03-14 07:34:28

标签: c# generics deserialization sortedlist binaryformatter

我想在一个通用的SortedList中反序列化,就像这个带有哈希表的例子

一样

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

但是在这一行

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

我正在获得InvalidCastException,我该如何修复?为什么?

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

和 formatter是一个BinaryFormatter对象

1 个答案:

答案 0 :(得分:2)

虽然它没有实现接口ISerializable,但它似乎是可序列化的(它有[SerializableAttribute])尝试运行代码即使机器显示Sortedlist实际上是可序列化的,猜测castexception应该是因为通用参数。

我测试的代码如下:

<强>序列化

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();
    }
}

<强>反序列化

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();
}