这里有一个神秘的例外:XamlParseException

时间:2012-06-01 00:46:19

标签: c# wpf xaml xamlparseexception

这是我的代码:

    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)zh   System.Xml.XmlTextReaderImpl.Throw(String res,String arg)zh   System.Xml.XmlTextReaderImpl.ThrowUnclosedElements()zh   System.Xml.XmlTextReaderImpl.ParseAttributes()zh   System.Xml.XmlTextReaderImpl.ParseElement()zh   System.Xml.XmlTextReaderImpl.ParseDocumentContent()zh   System.Xml.XmlTextReaderImpl.Read()zh   System.Xml.XmlTextReader.Read()zh   System.Runtime.Serialization.Formatters.Soap.SoapParser.ParseXml()
  en System.Runtime.Serialization.Formatters.Soap.SoapParser.Run()zh   System.Runtime.Serialization.Formatters.Soap.ObjectReader.Deserialize(HeaderHandler   handler,ISerParser serParser)en   System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(流   serializationStream,HeaderHandler handler)en   System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(流   serializationStream)en   Solution1.MainWindow.ReturnListOfPersistentFile [T](String Filename)en   c:\ users \ u201114160 \ documents \ visual studio   2010 \ Projects \ Solution1 \ Solution1 \ MainWindow.xaml.cs:línea99en   Solution1.MainWindow.Do()c:\ users \ u201114160 \ documents \ visual   studio 2010 \ Projects \ Solution1 \ Solution1 \ MainWindow.xaml.cs:línea45
  en Solution1.MainWindow..ctor()zh   c:\ users \ u201114160 \ documents \ visual studio   2010 \ Projects \ Solution1 \ Solution1 \ MainWindow.xaml.cs:línea36

它让我疯狂,有些想法?抛出这个异常是因为“ReturnListOfPersistentFile”泛型方法,但是为什么?

提前致谢。

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

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

  

我们已决定不再为Whidbey的SoapFormatter投入任何重要的新功能

谢谢大家。

1 个答案:

答案 0 :(得分:0)

查看堆栈跟踪,我注意到方法ThrowUnclosedElements。这让我觉得你有一个损坏或格式错误的文件。

正如您自己指出的那样,SOAP序列化不支持通用列表。据我所知,这意味着您尝试序列化List,结果您得到了一个无法反序列化的文件。这已经在here之前讨论过了,还有here(你自己的引用)在其他地方讨论过。

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

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