3

我想在一个通用的 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 对象

4

1 回答 1

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();
}
于 2013-03-14T07:36:17.880 回答