2017-08-11 108 views
0

我有一個流,我想通過XmlSerializer使用流時,動態替換文本。初始流應保持不變。裝飾StreamReader並替換讀取文本

我試圖凌駕於StreamReader的閱讀方法,但我有點掙扎:

public class ConfigHookReader : StreamReader 
{ 
    public ConfigHookReader(Stream stream) 
     : base(stream) 
    { 
    } 

    public override int Read(char[] buffer, int index, int count) 
    { 
     var stringValue = new string(buffer); 
     var replacedString = stringValue.Replace('A', 'B'); 
     var newBuffer = replacedString.ToCharArray(); 

     for (int i = 0; i < buffer.Length; i++) 
     { 
      buffer[i] = newBuffer[i]; 
     } 

     return base.Read(buffer, index, count); 
    } 
} 


[Test] 
public void ReplaceIsWorking() 
{ 
    XmlSerializer deserializer = new XmlSerializer(typeof(DummyClass)); 
    var initialText = @"<DummyClass SomeString=""ABC""></DummyClass>"; 
    using (TextReader reader = new ConfigHookReader(new MemoryStream(initialText.Select(Convert.ToByte).ToArray()))) 
    { 
     var instance = (DummyClass)deserializer.Deserialize(reader); 
     Assert.AreEqual("AAC", instance.SomeString);//this si failing, SomeString = ABC 
    } 
} 
+0

如果你想更換比單個字符由單個字符多,這變得相當複雜,因爲你需要緩存讀取過多次調用的數據 - 所以我希望你用這一切的是過濾/替換個別有問題的角色。 –

+0

@JeroenMostert實際上,是的目標是取代任何長度的字符串... – Toto

+0

然後,你有你的工作切斷你。考慮一下你認識'wordToReplace'的場景,但是'index + count'不能給你足夠的空間來用'wordToReplaceThatIsLonger'替代它。如果您沒有處理多字節字符串,爲避免內存問題需要進行這種即時替換,請考慮一種更簡單的換行策略,即您的「TextReader」將其他「TextReader」包裝(不覆蓋)以首先讀取所有文本,替換它,並將其餘工作委託給['StringReader'](https://msdn.microsoft.com/library/system.io.stringreader)。 –

回答

1

可能是我完全錯了......但傳遞給讀功能的字符數組將被填補該函數初始化爲空(或內容將被覆蓋)。替換函數無法工作,因爲當您遍歷數組時,數組未被填充...
因此,先從流中讀取數據,然後替換內容。如果你只是替換單個字符跳過字符串創建的性能原因'... 未經測試,因爲我沒有IDE可用在這裏。

public class ConfigHookReader : StreamReader 
{ 
    public override int Read(char[] buffer, int index, int count) 
    { 
     var read = base.Read(buffer, index, count); 

     // EDIT (original) for (int i = 0; i < buffer.Length; i++) 
     for (int i = 0; i < read; i++) 
     { 
      if (buffer[i] == 'A') 
       buffer[i] = 'B'; 
     } 

     return read; 
    } 
} 
+0

你可能只需要循環到'read'字符(即'i

+1

'我<讀'; 'buffer [index + i]'。 –

+0

是的,它正在工作。字符串的使用是因爲我實際上想要替換任何長度的字符串,並且更容易作爲第一步。 – Toto