2011-03-22 29 views
14

Ben ekstresinde "Akış okunabilir değildi" mesajı alıyorum değildi. Yardım için teşekkürler.Akış okunabilir hata

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Conflict)); 
//Serialize Conflicts array to memorystream as XML 
using (MemoryStream ms = new MemoryStream()) 
{ 
    using (StreamWriter sw = new StreamWriter(ms)) 
    { 
     foreach (Conflict ct in Conflicts)  
      xmlSerializer.Serialize(sw, ct); 

     sw.Flush(); //Site tip 
     ms.Position = 0; //Site tip 
    } 
    //Retrieve memory stream to string 
    using (StreamReader sr = new StreamReader(ms)) 
    { 
     string conflictXml = String.Format(CultureInfo.InvariantCulture, "{0}</NewDataSet>", 
+1

Biçimlendirilmiş kod takip edip – BrMcMullin

+1

StreamWriter hata ayıklama yardımcı olmak kolay olurdu ve bertaraf ederken kapatıldı akışından okumaya çalışıyorum gidince StreamReader hem gibi, altta yatan akışını kapattığında sizi StreamWriter imha edildiğinde, akış artık okuma veya yazma için açık değildir. Maalesef şu anda bilgisayarımda değilim, ancak bu sitedeki diğer cevaplar, kapatılmasını önlemek için temel akışı sarmak için sınıflara sahiptir. –

+0

Daha önce bu cevabım ile bağlantılı bir sarmalayıcı sınıf bulunabilir: http://stackoverflow.com/questions/5261123/why-is-my-filestream-object-being-disposed-of-when-im-using- a-binaryreader-obj/5261202 # 5261202 –

cevap

16

bu kod bloğu tamamlar, aynı zamanda

using (StreamWriter sw = new StreamWriter(ms)) 
    { 
foreach (Conflict ct in Conflicts)         xmlSerializer.Serialize(sw, ct); 
sw.Flush(); //Site tip 
ms.Position = 0; //Site tip 
} 

kullanarak ifadeyi kaldırın ekli MemoryStream imha ve sen elle sonra akışı bertaraf edecektir:

Bu

benim kodudur onunla bitti

StreamWriter sw = new StreamWriter(ms); 

    foreach (Conflict ct in Conflicts)         xmlSerializer.Serialize(sw, ct); 
    sw.Flush(); //Site tip 
    ms.Position = 0; //Site tip 

// other code that uses MemoryStream here... 

sw.Dispose(); 
+1

In .Net 4.5, akışı açık bırakmak için belirtilebilecek bir StreamWriter yüklemesi var: https://msdn.microsoft.com/EN-US/library/gg712853(v=VS. 110, d = hv.2) .aspx – user3285954

+1

Ve 'try/finally' bloğundaki her şeyi kapatmayı ve 'nihayet' bloğundaki 'sw.Dispose()' ı eklemeyi unutmayın. Try/finally' bloğu dışında StreamWriter sw' tanımlamanız gerekecektir. – Gabrielius

2

Bunun yerine bunu deneyin (Çakışan türü olduğu varsayılıyor) List<Conflict>):

XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Conflict>)); 
StringWriter sw = new StringWriter(); 
xmlSerializer.Serialize(sw, Conflicts); 
string conflictXml = sw.GetStringBuilder().ToString(); 
+0

Bu sadece genel bir koleksiyonla çalışacak mı? Şu an takılıyorum. Net 1.1. –