В целом Вы не можете сделать этого. UTF-8 способен к кодированию любой кодовой точки Unicode. ISO-8859-1 может обработать только крошечную часть их. Так, транскодирование от ISO-8859-1 до UTF-8 не является никакой проблемой. Движение назад от UTF-8 до ISO-8859-1 вызовет "символы замены" (�) для появления в тексте, когда неподдерживаемые символы найдены.
Для транскодирования текста:
byte[] latin1 = ...
byte[] utf8 = new String(latin1, "ISO-8859-1").getBytes("UTF-8");
или
byte[] utf8 = ...
byte[] latin1 = new String(utf8, "UTF-8").getBytes("ISO-8859-1");
можно осуществить больше контроля при помощи низшего уровня Charset
API. Например, можно повысить исключение, когда un-encodable символ найден, или используйте другой символ для текста замены.
Когда вы используете первый метод, вы используете перегрузку XDocument, которая сначала принимает XDeclaration, а затем параметры для содержимого. Однако, когда вы используете второй подход, вы используете перегрузку, которая принимает параметры для содержимого. XDeclaration в вашем массиве object [] проходит как контент, и вот где он взрывается.
См. Здесь: http://msdn.microsoft.com/en-us/library/system.xml. linq.xdocument.xdocument.aspx