0

这是我的代码:

    public partial class MainWindow : Window
{
    List<Cliente> CContent;
    string mainPath = @"D:\70-536\Clientes.dat";

    public MainWindow()
    {
        InitializeComponent();
        Do();
    }

    private void Do()
    {

        FileInfo fi = new FileInfo(mainPath);
        if (fi.Exists)
        {
            CContent = ReturnListOfPersistentFile<Cliente>(mainPath);
        }
        else
        {
            CContent = new List<Cliente>();
        }
    }

    public List<T> ReturnListOfPersistentFile<T> (string Filename)
    {
        SoapFormatter sf = new SoapFormatter();

        using (Stream fStream = new FileStream(Filename,FileMode.Open, FileAccess.Read,FileShare.None))
        {
            List<T> list = new List<T>();
            list = (List<T>)sf.Deserialize(fStream);

            return list;
        }

    }

这是我的内部异常的堆栈跟踪:

en System.Xml.XmlTextReaderImpl.Throw(Exception e) en System.Xml.XmlTextReaderImpl.Throw(String res, String arg) en System.Xml.XmlTextReaderImpl.ThrowUnclosedElements() en System.Xml.XmlTextReaderImpl.ParseAttributes() en System. Xml.XmlTextReaderImpl.ParseElement() 和 System.Xml.XmlTextReaderImpl.ParseDocumentContent() 和 System.Xml.XmlTextReaderImpl.Read() 和 System.Xml.XmlTextReader.Read() 和 System.Runtime.Serialization.Formatters.Soap.SoapParser。 ParseXml()
en System.Runtime.Serialization.Formatters.Soap.SoapParser.Run() en System.Runtime.Serialization.Formatters.Soap.ObjectReader.Deserialize(HeaderHandler handler, ISerParser serParser) en System.Runtime.Serialization.Formatters.Soap.SoapFormatter。 Deserialize(Stream serializationStream, HeaderHandler handler) zh System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(Stream serializationStream) zh Solution1.MainWindow.ReturnListOfPersistentFile[T](String Filename) en c:\users\u201114160\documents\visual studio 2010\Projects\Solution1\Solution1\MainWindow.xaml.cs:línea 99 en Solution1.MainWindow.Do() en c:\users\u201114160\documents\visual studio 2010\Projects\Solution1\Solution1\MainWindow.xaml.cs :linea 45
zh Solution1.MainWindow..ctor() zh c:\users\u201114160\documents\visual studio 2010\Projects\Solution1\Solution1\MainWindow.xaml.cs:linea 36

它让我发疯,一些想法?这个异常是因为“ReturnListOfPersistentFile”泛型方法而引发的,但是为什么?

提前致谢。

解答: 我试图用 SOAP 格式化程序序列化一个通用列表,但 SOAP 格式化程序不支持通用列表。

我在forums.microsoft.com 上遇到了这个帖子。让我引用微软员工的话:

我们决定不为 Whidbey 的 SoapFormatter 投资任何重要的新功能工作

谢谢大家。

4

1 回答 1

0

查看您的堆栈跟踪,我注意到 ThrowUnclosedElements 方法。这让我认为您的文件已损坏或格式错误。

正如您自己所指出的,SOAP 序列化不支持通用列表。据我了解,这意味着您尝试序列化 List ,结果您得到了一个无法反序列化的文件。这已经在此处讨论过,也在这里(您自己引用)等其他地方讨论过。

一个解决方案可能是使用非通用的、老式的、被遗忘的ArrayList。当然,您必须访问这些项目并将它们转换为适当的类型,这可以通过包装类来完成。

另一种方法是序列化每个对象的对象,而不是序列化列表。

于 2012-06-01T03:30:39.510 回答