使用特殊字符快速反序列化XML的方法

我正在寻找快速反序列化xml的方法,它有像ö那样的特殊字符。

我正在使用XMLReader,它无法反序列化这些字符。

有什么建议吗?

编辑:我正在使用C#。 代码如下:

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

我猜你有编码问题,不是在XMLReader而是在XmlSerializer

您可以将XmlTextWriter和UTF8编码与XmlSerializer一起使用,如下面的代码段所示(请参阅下面的通用方法,以便更好地实现它)。 适用于变音符号(äöü)和其他特殊字符

 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; } } 

我个人使用以下通用方法来序列化和反序列化XML和对象,并且还没有任何性能或编码问题。

 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); } 

对我有用的东西与@ martin-buberl建议的相似:

 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; } 

试过上面的事情?

我没有检查过,但是这个想到了。 我设法对具有åäö等的数据进行de +序列化。你不是在谈论标记名吗?