2011-07-08 56 views
2

我在從MemoryStream反序列化XML文件時遇到問題。我有一個生成的MyXmlFile類和一個MemoryStream包含一個XML文件,我想反序列化成MyXmlFile類型的對象。使用XmlSerializer.Deserialize從MemoryStream中反序列化XML文件不起作用

public static class XmlSerializeObject 
{ 
    public static T FromStream<T>(Stream s) 
    { 
     var serializer = new XmlSerializer(typeof(T)); 
     return (T) serializer.Deserialize(s); 
    } 
} 

我有一個MemoryStream MS包含一個XML文件。如果我試圖在流反序列化爲類型的對象MyXmlFile我得到一個異常「有XML文檔中的錯誤(0,0)」

MyXmlFile test = XmlSerializeObject.FromStream<MyXmlFile>(ms); 

但是我覈實,我的MemoryStream是正確的。如果我首先將我的流寫入光盤上的文件並再次讀取該文件,那麼它可以正常工作。

 FileStream outStream = File.OpenWrite("D:\\p.xml"); 
     outStream.Write(((MemoryStream)ms).ToArray(), 0, ((MemoryStream)ms).ToArray().Length); 
     outStream.Flush(); 
     outStream.Close(); 
     MyXmlFile test= XmlSerializeObject.FromStream<MyXmlFile>(File.OpenRead("D:\\p.xml")); 

我無法自己找到解決方案,所以我決定發佈我的問題。也許以前有人有同樣的問題,並能夠幫助我。

在此先感謝。如果有什麼不清楚的地方,請詢問。

+0

能否請您添加類'MyXmlFile'的定義是什麼? –

+0

你能發佈你如何將XML文件加載到內存流中,並確認你正在將流重置爲位置0,類似於'Seek(0,SeekOrigin.Begin)' – Kane

+0

這聽起來像你可能已經使用了內存流在將它傳遞給序列化程序之前,情況可能如此嗎?如果是這樣,請事先重置內存流位置。 - 編輯:@Kane打敗我在stream.Position的東西^^ – Smudge202

回答

7

如果您在調用反序列化之前實例化了您的內存流(比如說,首先將XML加載到內存流中),則可能是它的索引錯誤。嘗試

ms.Seek(0, SeekOrigin.Begin) 

返回到流的開頭。

+0

我覺得沒有想到這一點,並嘗試它的愚蠢,但這完全是爲什麼它沒有工作。 :/非常感謝你 –

+0

這發生在我身上的事情比我更願意承認。 – AllenG

0

您必須設置的MemoryStream的位置到0

((MemoryStream)ms).Position = 0; 
MyXmlFile test = XmlSerializeObject.FromStream<MyXmlFile>(ms);