Ошибка национальных символов в XML-сериализации - PullRequest
0 голосов
/ 20 октября 2011

EDIT:

Делать слишком много ... это работает для меня с национальными символами

                var xs = new XmlSerializer(typeof(ToDoItem));
                var stringWriter = new StringWriter();
                xs.Serialize(stringWriter, item);
                var test = XDocument.Parse(stringWriter.ToString());

... где Предмет - объект, содержащий строки с национальными символами

/ EDIT

Я сделал проект с сериализацией некоторых объектов.

Я скопировал некоторый код из примеров на этом сайте, и все работало замечательно, пока я не изменил среду ASP.NET с 3.5 до 4.0 ... (и не изменил настройку ISS7 .net с v2.0 на v4.0)

Я на 99% уверен, что это является причиной следующей ошибки:

Перед этим измените что-то вроде этого:

                var test = XDocument.Parse(SerializeObject("æøåAØÅ", typeof(string)));
                test.Save(HttpContext.Current.Server.MapPath("test.xml"));

Сохранит xml с точными используемыми символами.

Теперь он сохраняет это: A

Я хотел бы: Информация о настройках, которые мне, возможно, придется выполнить в IIS7

OR

Комментарий о том, как изменить методы сериализации для лучшей обработки национальных символов.

Используется код сериализации.

  private static String UTF8ByteArrayToString(Byte[] characters)
    {
        var encoding = new UTF8Encoding();

        String constructedString = encoding.GetString(characters);

        return (constructedString);
    }



    public static String SerializeObject(Object pObject, Type type)
    {
        try
        {
            String XmlizedString = null;
            var memoryStream = new MemoryStream();
            var xs = new XmlSerializer(type);
            var xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.ASCII);


            xs.Serialize(xmlTextWriter, pObject);
            memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
            XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());
            return XmlizedString.Trim();
        }

        catch (Exception e)
        {
            //Console.WriteLine(e);

            return null;
        }
    }

1 Ответ

1 голос
/ 20 октября 2011

Вы сохраняете текст как ASCII, а затем декодируете его с помощью UTF-8 и ожидаете, что он будет работать? Не будет Этот код никогда не сможет работать должным образом, независимо от каких-либо обновлений или настроек.

Нет необходимости записывать XML в MemoryStream и затем декодировать его. Просто используйте StringWriter:

var xs = new XmlSerializer(type);
var stringWriter = new StringWriter();
xs.Serialize(stringWriter, pObject);
return stringWriter.ToString();
...