2012-07-19 62 views
0

我对XMLReader/XMLTextReader类有一个非常奇怪的问题。无法成功克隆XMLReader(意外的EOF)

我有一个简单的文件加载:

public void First() 
{ 
    XmlTextReader reader = new XmlTextReader(@"C:\MyXMLFile.xml"); 
    XmlReader readerToSerialize; 
    XmlReader readerToLoad; 
    DuplicateReaders(reader, out readerToSerialize, out readerToLoad); 
    XmlSerializer serializer = new XmlSerializer(typeof(XMLTree)); 
    XmlFeed = (XMLDescriptor)serializer.Deserialize(readerToSerialize); 
    xmlDoc.Load(readerToLoad); 
} 
protected void DuplicateReaders(XmlTextReader xmlReader, out XmlReader cloneOne, out readerToLoad) 
{ 
    XmlDocument _XmlDocument = new XmlDocument(); 
    MemoryStream _Stream = new MemoryStream(); 
    _XmlDocument.Load((XmlTextReader)xmlReader); 
    _XmlDocument.Save(_Stream); 
    _Stream.Position = 0L; 
    cloneOne = XmlReader.Create(_Stream); 
    _Stream.Position = 0L; 
    cloneTwo = XmlReader.Create(_Stream); 
} 

的问题是,只有克隆的内容之一读取整个文件successully,下一个(xmlDoc.Load)在同一个地方总是失败(线91,带有这个xml文件的字符37)。如果我直接分配给xmlDoc中(即克隆原始元素只有一次,直接从功能ASIGN吧):

public void First() 
{ 
    XmlTextReader reader = new XmlTextReader(@"C:\MyXMLFile.xml"); 
    XmlReader readerToSerialize; 
    DuplicateReaders(reader, out readerToSerialize); 
    XmlSerializer serializer = new XmlSerializer(typeof(XMLTree)); 
    XmlFeed = (XMLDescriptor)serializer.Deserialize(readerToSerialize); 
} 
protected void DuplicateReaders(XmlTextReader xmlReader, out XmlReader cloneOne) 
{ 
    XmlDocument _XmlDocument = new XmlDocument(); 
    MemoryStream _Stream = new MemoryStream(); 
    _XmlDocument.Load((XmlTextReader)xmlReader); 
    _XmlDocument.Save(_Stream); 
    _Stream.Position = 0L; 
    cloneOne = XmlReader.Create(_Stream); 
    _Stream.Position = 0L; 
    this.xmlDoc.Load(_Stream); 
} 

我仍然得到同样的错误第91/37号(意外EOF),但这次是在串行。

我最初的问题是,如果我使用xmlDoc.Load(reader)阅读器实例被破坏,我不能在以后序列化它。我在MSDN论坛上找到了Duplicate功能,但它仍然是一个不行。我想实现的很简单:

只使用一个阅读器并获取一个XmlDocument和一个序列化类。它能有多难?

回答

0

实测值更容易的解决方案,而不是克隆两个读取器,我只是使用创建从xmlDoc中的第二个,并使用它进行反序列化。

1

您需要先关闭第一个阅读器,然后才能使用副本。

reader.Close() 
+0

我克隆它之后(并且在我实际使用它的克隆之前),我关闭了阅读器,但是我仍然得到“Unxpected EOF”。 – Anonymous 2012-07-19 17:01:52

+0

你要关闭它什么? – 2012-07-19 17:04:46

+0

我正在关闭主阅读器,紧跟在Duplicate函数之后,以及第一个克隆,在它被使用之后。然而第二个克隆获取EOF。 – Anonymous 2012-07-19 17:06:40

1

您的cloneOne和cloneTwo都使用相同的底层内存流。

使用不同的MemoryStream

cloneTwo = XmlReader.Create(new MemoryStream(_Stream.ToArray()));