Проблема C # XML-сериализации - PullRequest
1 голос
/ 04 октября 2010

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

 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.

Ответы [ 2 ]

1 голос
/ 04 октября 2010

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

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

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

0 голосов
/ 04 октября 2010

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

У меня проблема с редактором, который добавлял некоторые вещи в мой файл

...