2010-10-04 3 views
1

Я создал метод, который принимает объект, затем пытается сериализовать объект в Xml, сначала используя XmlSerializer для сериализации в строку, а затем загрузите Xml обратно в объект XmlDocument для возвращаемого метода. Код выглядит так:C# XML Serialization Problem

public static XmlDocument ConvertObjectToXMLMessage(object ObjectToConvert) 
    { 
     MemoryStream stream = null; 
     XmlWriter writer = null; 
     XmlSerializer serializer = null; 
     XmlDocument xmlDoc = new XmlDocument(); 
     UnicodeEncoding utf = new UnicodeEncoding(); 
     UTF8Encoding utf8 = new UTF8Encoding(); 
     ASCIIEncoding ascii = new ASCIIEncoding(); 
     string result = string.Empty; 

     try 
     { 
      stream = new MemoryStream(); 
      //writer = new StreamWriter(stream, Encoding.Unicode); 
      XmlWriterSettings settings = new XmlWriterSettings(); 
      settings.Encoding = Encoding.UTF8; 
      writer = XmlWriter.Create(stream, settings);     

      serializer = new XmlSerializer(ObjectToConvert.GetType()); 
      serializer.Serialize(writer, ObjectToConvert); 

      int count = Convert.ToInt32(stream.Length); 
      Byte[] arr = new Byte[count]; 

      stream.Seek(0, SeekOrigin.Begin); 

      stream.Read(arr, 0, count); 

      result = utf8.GetString(arr).Trim(); 

      // if this is being used during a debug session, the xml will be written to the Debug Console 
#if DEBUG 
      //blank line before 
      Debug.WriteLine(string.Empty); 
      // output result 
      Debug.Write(result); 
      //blank line after 
      Debug.WriteLine(string.Empty); 
#endif 

      xmlDoc.LoadXml(result); 

      return xmlDoc; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      if (writer != null) 
       writer.Close(); 
     } 
    } 

Все работает хорошо до команды xmlDoc.LoadXml (result). Это вызывает исключение; {«Данные на корневом уровне недействительны. Строка 1, позиция 1."}

Как вы можете видеть, я объявил несколько переменных кодирования. Если я использую кодировку ASCII, она работает. Мне нужно использовать UTF8.

Любые идеи, почему это не работает? Я думаю, что это из-за ложных символов, вставленных в начале сериализации Xml. Как мне избежать этого? Типы классов, которые я мог бы сериализовать, были бы объектно-ориентированными объектами или прокси-классом, сгенерированными из XSD или WSDL.

ответ

1

Что делать, если вы загружаете поток напрямую, не читая его вручную или не меняя его?

XmlDocument xd = new XmlDocument(); 
xd.Load(stream); 

Это, по меньшей мере, уменьшит количество мест, где может возникнуть ошибка.

+0

{ «Корневой элемент отсутствует.»} – Carl

+0

@Carl что длина потока? Просто проверьте, что он не пуст (потому что вы получите ту же ошибку). –

+0

Тим, он не пуст. Я подумал об этом, но есть определенно содержание. – Carl

0

Код, кажется, прекрасен ... вы открываете редактор, прежде чем пытаетесь получить доступ к файлу по коду?

Я получил эту проблему с помощью редактора, который был добавив некоторые вещи в моем файле

+0

Я думал, что все в порядке! Я не могу открыть его с помощью редактора сначала, поскольку он все в памяти. – Carl