Причины чтобы не иметь кластерного индекса в SQL Server 2005

Я унаследовал несколько сценариев создания базы данных для базы данных SQL SERVER 2005.

Одна вещь, которую я ' Проблема в том, что кодировка указана неверно в XML-заголовке (там написано iso-8859-1, но это utf-16BE). Это ...

Я пытаюсь прочитать некоторый XML, полученный из внешнего интерфейса через сокет. Проблема в том, что кодировка указана неверно в XML-заголовке (там написано iso-8859-1, но это utf-16BE). Документировано, что кодировка - utf-16BE, но, видимо, они забыли установить правильную кодировку.

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

    private static T DeserializeXmlData<T>(byte[] xmlData)
    {
        var xmlString = Encoding.BigEndianUnicode.GetString(xmlData);
        using (var reader = new StringReader(xmlString))
        {
            reader.ReadLine(); // Eat header line
            using (var xmlReader = XmlReader.Create(reader))
            {
                var serializer = new XmlSerializer(typeof(T));
                return (T)serializer.Deserialize(xmlReader);
            }
        }
    }

Вышеупомянутое действительно работает нормально, но я не Мне не нравится та часть, где я просто пропускаю строку заголовка, вызывая ReadLine. Есть ли менее хрупкий способ обойти кодировку, указанную в XML-заголовке?

Решение с StreamReader

Используя StreamReader, я могу переопределить кодировку, указанную в XML-заголовке. Указание XmlReaderSettings.IgnoreProcessingInstructions или нет никакой разницы не повлияло. Интересно, что StreamReader игнорирует указанную кодировку, если находит метку порядка байтов Unicode.

Напомним:

  • Если XmlReader инициализируется с помощью TextReader, кодировка заголовка XML игнорируется.
  • Если используется StringReader , XmlReader не работает, если существует метка порядка байтов в Юникоде.
  • Если используется StreamReader, метка порядка байтов в Юникоде переопределяет кодировку StreamReader.
  • XmlReaderSettings.IgnoreProcessingInstructions = true не имеет значения при использовании TextReader.

В заключение, наиболее надежным решением, по-видимому, является использование StreamReader, поскольку он использует отметку порядка байтов, если она присутствует.

    private static T DeserializeXmlData<T>(byte[] xmlData)
    {
        using (var xmlDataStream = new MemoryStream(xmlData))
        {
            using (var reader = new StreamReader(xmlDataStream, Encoding.BigEndianUnicode))
            {
                using (var xmlReader = XmlReader.Create(reader))
                {
                    var serializer = new XmlSerializer(typeof (T));
                    return (T) serializer.Deserialize(xmlReader);
                }
            }
        }
    }
7
задан Holstebroe 28 October 2010 в 09:28
поделиться