2016-10-05 4 views
1

Я хочу десериализовать xml-файл, который имеет специальный символ в одном из своих полей. Символ шестнадцатеричный 0x05 и приводит к xml-файлу к . Я могу сериализовать объект, но его невозможно снова десериализовать. Я использую эту технику очень часто, но это первый раз, когда она не работает. Это минимальный пример задачи:XML Deserialize специальные символы

using System.Xml.Serialization; 
using System.IO; 

namespace XMLTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SpecialCharacter testobject = new SpecialCharacter(); 
      string filename = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + @"\testfile.xml"; 

      //serialize 
      StreamWriter writer = System.IO.File.CreateText(filename); 
      XmlSerializer xmlserialize = new XmlSerializer(typeof(SpecialCharacter)); 
      xmlserialize.Serialize(writer, testobject); 
      writer.Flush(); 
      writer.Close(); 

      //deserialize 
      StreamReader reader = File.OpenText(filename); 
      XmlSerializer xmldeserialize = new XmlSerializer(typeof(SpecialCharacter)); 
      testobject = (SpecialCharacter)xmldeserialize.Deserialize(reader); 
      reader.Close(); 
     } 
    } 

    public class SpecialCharacter 
    { 
     public string special = char.ConvertFromUtf32(0x05).ToString(); 
    } 
} 

ответ

2

Вы должны использовать специальный считыватель, который имеет свое свойство Нормирование значение ЛОЖЬ.

Таким образом, вместо

StreamReader reader = File.OpenText(filename); 

использование

XmlTextReader reader = new XmlTextReader(filename); 

Теперь он должен работать.

+0

Это трюк, удобный и эффективный – RoKi0815

+0

Кажется, что Microsoft предлагает использовать' XmlReader' вместо 'XmlTextReader'. Оба работают. [Ссылка] (https://msdn.microsoft.com/de-de/library/system.xml.xmltextreader (v = vs.110) .aspx) – RoKi0815

1

Есть два простых (-ish) решения здесь:

  • использовать XmlTextReader.Create вместо File.CreateText и добавить new XmlReaderSettings() { CheckCharacters = false } в качестве второго параметра. Вероятно, вам следует избегать этого, если честно, если только вы не работаете над создаваемыми вами файлами и не знаете их содержимое.
  • сериализовать String в Base64:

public class SpecialCharacter 
{ 
    [XmlElement(ElementName = "special")] 
    public String Base64 
    { 
     get 
     { 
      return Convert.ToBase64String(System.Text.Encoding.UTF32.GetBytes(special)); 
     } 
     set 
     { 
      if (value == null) 
      { 
       special = null; 
       return; 
      } 

      special = System.Text.Encoding.UTF32.GetString(Convert.FromBase64String(value)); 
     } 
    } 

    [XmlIgnore] 
    public String special = Char.ConvertFromUtf32(0x05).ToString(); 
} 
+0

это не решит проблему чтения xml-файла. процесс записи не изменяется (xml-файл совпадает). Также неясно, что вы имеете в виду, потому что для записи мне пришлось использовать «XmlTextWriter», а не «XmlTextReader», или я пропустил что-то понять. Base64-String - хорошая идея, но у меня всегда есть много файлов с этой проблемой, и для меня более важно, чтобы они могли правильно их читать, вместо того чтобы менять код для будущих файлов. Мне нравится атрибут 'XmlIgnore' :) – RoKi0815

Смежные вопросы