2014-02-27 65 views
0

我的应用程序在XML文件打开时反序列化数据。在反序列化工作正常第一次加载应用程序,但是当我尝试重新打开该程序,我得到以下错误:XML重新反序列化错误

2/27/2014 6:27:30 PM : Error: There is an error in XML document (9, 6).. Stacktrace: at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle) at XMLInterface.XMLInterface.Deserialize(String CallingSub, String LocalFileURI) in C:\AzTech\Satellite\Code Repository\trunk\Ribbon\XMLInterface\Code\XMLInterface.vb:line 66 

此外,应用程序是一个附加的解决方案的一部分,这样当应用程序关闭,加载项仍在运行。如果我关闭加载项并重新运行它,序列化工作正常;只有在我关闭并重新打开应用程序后,才会发生错误。

这里是我的代码:

 Dim ser As New XmlSerializer(ElementsLocal.GetType) 
     Dim objStreamReader As New StreamReader(LocalFileURI) 
     ElementsLocal = ser.Deserialize(objStreamReader) 
     objStreamReader.Close() 
     objStreamReader.Dispose() 
     ser = Nothing 
     GC.Collect() 

有没有人有什么想法?我需要以某种方式发布文件吗?我认为,一旦反序列化小组退出文件将被释放,但是情况并非如此?

编辑:

For Each Name As String In System.IO.Directory.GetFiles(My.Settings.savePath) 
     Dim cBox As New ComboBoxItem 
     cBox.Content = System.IO.Path.GetFileNameWithoutExtension(Name) 
     cBox.Style = TryFindResource("blackComboBoxItem") 
     cmbBxQBDNames.Items.Add(cBox) 
    Next 

编辑2: 该文件是由这些过程以及(不知道这是否会影响到的情况)来访问 包装纸的代码,如建议,做也不行:

 Dim ser As New XmlSerializer(ElementsLocal.GetType) 
     Using fs As FileStream = New FileStream(LocalFileURI, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 
      Using objStreamReader As New StreamReader(fs) 
       ElementsLocal = ser.Deserialize(objStreamReader) 
      End Using 
     End Using 
     ser = Nothing 
+0

发生整个错误会很有帮助,而不仅仅是堆栈跟踪。 –

+0

我早先放入了整个错误信息,但它被其他人编辑了出来。 – user

+0

它看起来像一个堆栈跟踪转储到日志文件。我指的是整个错误,告诉你哪里出了问题,哪里(我们已经有这个部分)。 –

回答

0

的问题是,当您打开使用的StreamReader的文件,它锁定从正在使用的其他工艺文件ES。这包括您在启动第二个实例时的应用程序,并且第一个未完全耗尽内存。试试这段代码:

Dim ser As New XmlSerializer(ElementsLocal.GetType) 
Using fs As FileStream = New FileStream(LocalFileURI, _ 
             FileMode.Open, _ 
             FileAccess.Read, _ 
             FileShare.ReadWrite) 
    Using objStreamReader As New StreamReader(fs) 
     ElementsLocal = ser.Deserialize(objStreamReader) 
    End Using 
End Using 
ser = Nothing 
GC.Collect() 

Using语句定义了一个你想要清理的对象。在End Using行处,编译器将在Using行中创建的对象的Dispose(它也将为您关闭)。如果您正在处理文件,网络流或其他应用程序,但一次只能处理一件事,那么Using声明是一个不错的选择。

FileStream对象为您提供了一种打开具有不同访问级别的文件以最小化(或最大化)与其他进程的干扰的方法。您只想打开现有文件,而不是创建或追加 - FileMode。你不需要对这个文件做任何事情,除了阅读它的内容 - FileAccess。您想尽量减少可能需要访问该文件的其他进程的问题 - FileShare

+0

此解决方案看起来很有希望,但它没有解决错误 - 我仍然得到一个“Object Reference ...”消息。 – user

+0

您的代码的其他部分是否打开相同的文件?如果是这样,您将需要做类似的事情来防止文件锁定问题。 –

+0

我发现的唯一其他代码以我作为编辑添加的某种方式访问​​文件。这些过程会影响这种情况吗? – user