maneira rápida de desserializar XML com caracteres especiais

Eu estou procurando uma maneira rápida de desserializar xml, que tem caracteres especiais como ö.

Eu estava usando XMLReader e ele não deserialze esses caracteres.

Alguma sugestão?

EDIT: eu estou usando c #. O código é o seguinte:

XElement element =.. //has the xml XmlSerializer serializer = new XmlSerializer(typeof(MyType)); XmlReader reader = element.CreateReader(); Object o= serializer.Deserialize(reader); 

Eu acho que você está tendo um problema de codificação, não no XMLReader mas com o XmlSerializer .

Você pode usar a codificação XmlTextWriter e UTF8 com o XmlSerializer como no snippet a seguir (consulte os methods genéricos a seguir para obter uma implementação mais agradável). Funciona muito bem com umlauts (äöü) e outros caracteres especiais .

 class Program { static void Main(string[] args) { SpecialCharacters specialCharacters = new SpecialCharacters { Umlaute = "äüö" }; // serialize object to xml MemoryStream memoryStreamSerialize = new MemoryStream(); XmlSerializer xmlSerializerSerialize = new XmlSerializer(typeof(SpecialCharacters)); XmlTextWriter xmlTextWriterSerialize = new XmlTextWriter(memoryStreamSerialize, Encoding.UTF8); xmlSerializerSerialize.Serialize(xmlTextWriterSerialize, specialCharacters); memoryStreamSerialize = (MemoryStream)xmlTextWriterSerialize.BaseStream; // converts a byte array of unicode values (UTF-8 enabled) to a string UTF8Encoding encodingSerialize = new UTF8Encoding(); string serializedXml = encodingSerialize.GetString(memoryStreamSerialize.ToArray()); xmlTextWriterSerialize.Close(); memoryStreamSerialize.Close(); memoryStreamSerialize.Dispose(); // deserialize xml to object // converts a string to a UTF-8 byte array. UTF8Encoding encodingDeserialize = new UTF8Encoding(); byte[] byteArray = encodingDeserialize.GetBytes(serializedXml); using (MemoryStream memoryStreamDeserialize = new MemoryStream(byteArray)) { XmlSerializer xmlSerializerDeserialize = new XmlSerializer(typeof(SpecialCharacters)); XmlTextWriter xmlTextWriterDeserialize = new XmlTextWriter(memoryStreamDeserialize, Encoding.UTF8); SpecialCharacters deserializedObject = (SpecialCharacters)xmlSerializerDeserialize.Deserialize(xmlTextWriterDeserialize.BaseStream); } } } [Serializable] public class SpecialCharacters { public string Umlaute { get; set; } } 

Eu pessoalmente uso os methods genéricos follwing para serializar e desserializar XML e objects e ainda não tive nenhum problema de desempenho ou codificação.

 public static string SerializeObjectToXml(T obj) { MemoryStream memoryStream = new MemoryStream(); XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); xmlSerializer.Serialize(xmlTextWriter, obj); memoryStream = (MemoryStream)xmlTextWriter.BaseStream; string xmlString = ByteArrayToStringUtf8(memoryStream.ToArray()); xmlTextWriter.Close(); memoryStream.Close(); memoryStream.Dispose(); return xmlString; } public static T DeserializeXmlToObject(string xml) { using (MemoryStream memoryStream = new MemoryStream(StringToByteArrayUtf8(xml))) { XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); using (StreamReader xmlStreamReader = new StreamReader(memoryStream, Encoding.UTF8)) { return (T)xmlSerializer.Deserialize(xmlStreamReader); } } } public static string ByteArrayToStringUtf8(byte[] value) { UTF8Encoding encoding = new UTF8Encoding(); return encoding.GetString(value); } public static byte[] StringToByteArrayUtf8(string value) { UTF8Encoding encoding = new UTF8Encoding(); return encoding.GetBytes(value); } 

O que funciona para mim é semelhante ao que @ martin-buberl sugeriu:

 public static T DeserializeXmlToObject(string xml) { using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml))) { XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); StreamReader reader = new StreamReader(memoryStream, Encoding.UTF8); return (T)xmlSerializer.Deserialize(reader); } } 
  [XmlElement(ElementName = "Profiles")] //public ProfilesType[] Profiles { get; set; } public Profiles Profiles { get; set; } 

Tentei algo acima?

Eu não chequei, mas isso me veio à mente. Eu consegui de + serializar dados que tem åäö etc U não estão falando sobre tagnames?