我有一個流,我想通過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
}
}
如果你想更換比單個字符由單個字符多,這變得相當複雜,因爲你需要緩存讀取過多次調用的數據 - 所以我希望你用這一切的是過濾/替換個別有問題的角色。 –
@JeroenMostert實際上,是的目標是取代任何長度的字符串... – Toto
然後,你有你的工作切斷你。考慮一下你認識'wordToReplace'的場景,但是'index + count'不能給你足夠的空間來用'wordToReplaceThatIsLonger'替代它。如果您沒有處理多字節字符串,爲避免內存問題需要進行這種即時替換,請考慮一種更簡單的換行策略,即您的「TextReader」將其他「TextReader」包裝(不覆蓋)以首先讀取所有文本,替換它,並將其餘工作委託給['StringReader'](https://msdn.microsoft.com/library/system.io.stringreader)。 –