public void WriteExternal(BinaryWriter output) { if (0x52 == _header.Type)//DoABC { DoABC abcBody = (DoABC)_body; MemoryStream buffer = new MemoryStream(); BinaryWriter bufferOut = new BinaryWriter(buffer, Encoding.UTF8); // Part 1: Write .abc to buffer abcBody.WriteExternal(bufferOut); // Part 2: Update and write header _header.Length = (int)buffer.Length; _header.WriteExternal(output); // Part 3: Copy .abc buffer into output buffer.Seek(0, SeekOrigin.Begin); byte[] bb = new byte[1024]; int len; while ((len = buffer.Read(bb, 0, 1024)) > 0) { output.Write(bb, 0, len); } } else { // Other tags can be written very simple _header.WriteExternal(output); _body.WriteExternal(output); } }