using System.Xml.Serialization;
public static void Main(string[] args)
XmlSerializer serializer = new XmlSerializer(typeof (ExampleClass));
var amountOfElements = 100;
using (var dataStream = new XmlExampleStream(amountOfElements))
using (var reader = new XmlTextReader(dataStream))
StringBuilder sb = new StringBuilder(1000);
case XmlNodeType.Element:
if (string.Equals(reader.Name, "specialelement"))
sb.Append("<").Append(reader.Name).Append(">");
case XmlNodeType.EndElement:
sb.Append("</").Append(reader.Name).Append(">");
if (string.Equals(reader.Name, "specialelement"))
using (TextReader textReader = new StringReader(sb.ToString()))
var deserializedElement = (ExampleClass)serializer.Deserialize(textReader);
HandleElement(deserializedElement);
Console.WriteLine("[done]");
public static void HandleElement(ExampleClass item)
Console.WriteLine("Handling element: {0}", item == null ? "NULL" : item.ToString());
[XmlRoot("specialelement")]
public class ExampleClass
[XmlElement(ElementName = "value1")]
[XmlElement(ElementName = "value2")]
public class XmlExampleStream : Stream
private readonly int _printElements;
private readonly int _length;
private const string Data = "<specialelement><value1>test</value1><value2>test3</value2></specialelement>";
private byte[] _streamBuffer = null;
private bool _rootStartPrinted = false;
private bool _rootEndPrinted = false;
private int _elementsPrinted = 0;
public XmlExampleStream(int printElements)
_printElements = printElements;
_length = (Encoding.Default.GetBytes(Data).Length * _printElements) + Encoding.Default.GetBytes("<root></root>").Length;
public override int Read(byte[] buffer, int offset, int count)
if (_elementsPrinted < _printElements)
var rootBytes = Encoding.Default.GetBytes("<root>");
if (rootBytes.Length > count)
throw new InvalidProgramException("Buffer too small");
Array.Copy(rootBytes, 0, buffer, offset, rootBytes.Length);
bytesWritten += rootBytes.Length;
_rootStartPrinted = true;
while (bytesWritten < count)
if (_streamBuffer == null)
_streamBuffer = Encoding.Default.GetBytes(Data);
if (_streamBuffer.Length == _buffIdx)
if (_elementsPrinted >= _printElements)
_streamBuffer = Encoding.Default.GetBytes(Data);
var bytesToCopy = Math.Min(_streamBuffer.Length - _buffIdx, count - offset);
Array.Copy(_streamBuffer, _buffIdx, buffer, offset, bytesToCopy);
bytesWritten += bytesToCopy;
if (_elementsPrinted >= _printElements)
_streamBuffer = Encoding.Default.GetBytes("</root>");
var bytesToCopy = Math.Min(_streamBuffer.Length - _buffIdx, count - offset);
Array.Copy(_streamBuffer, _buffIdx, buffer, offset, bytesToCopy);
bytesWritten += bytesToCopy;
public override void Flush()
throw new NotImplementedException();
public override long Seek(long offset, SeekOrigin origin)
throw new NotImplementedException();
public override void SetLength(long value)
throw new NotImplementedException();
public override void Write(byte[] buffer, int offset, int count)
throw new NotImplementedException();
public override bool CanRead
public override bool CanSeek
public override bool CanWrite
public override long Length
public override long Position