Быстрый способ десериализации XML с помощью специальных символов
Я ищу быстрый способ десериализации XML, в котором есть специальные символы, такие как ö.
Я использовал XMLReader, и он не может десериализовать такие символы.
Любое предложение?
РЕДАКТИРОВАТЬ: я использую C#. Код выглядит следующим образом:
XElement element =.. //has the xml
XmlSerializer serializer = new XmlSerializer(typeof(MyType));
XmlReader reader = element.CreateReader();
Object o= serializer.Deserialize(reader);
4 ответа
Я предполагаю, что у вас есть проблема с кодировкой, а не в 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>(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<T>(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<T>(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);
}
}
Самый простой способ сделать это — преобразовать символы из любой кодировки в кодировку Base64. Base64 преобразует любую строку в список печатных символов, тем самым избавляя от необходимости выполнять «5000 преобразований».
Serializable_Class class = new Serializable_Class();
string xml_string1 = SOME_XML1;
string xml_string2 = SOME_XML2;
string xml_string3 = SOME_XML3;
class .item1 = Convert.ToBase64String(Encoding.UTF8.GetBytes(xml_string1));
class .item2 = Convert.ToBase64String(Encoding.UTF8.GetBytes(xml_string2));
class .item3 = Convert.ToBase64String(Encoding.UTF8.GetBytes(xml_string3));
System.IO.MemoryStream payload_stream = new System.IO.MemoryStream();
System.Xml.Serialization.XmlSerializer payload_generator = new System.Xml.Serialization.XmlSerializer(class.GetType());
payload_generator.Serialize(payload_stream, class);
byte[] serialised_class = payload_stream.ToArray();
payload_stream.Close();
payload_stream.Dispose();
Строки класса, которые будут сериализованы, должны быть преобразованы в строки Base64. Объект MemoryStream должен быть инициирован для управления двоичной информацией процесса сериализации в памяти. Затем необходимо создать объект XmlSerializer для сериализации объекта с помощью метода Serialize(). Объект MemoryStream должен быть передан в качестве параметра, чтобы XmlSerializer мог управлять данными в памяти. После завершения сериализации сериализованный объект можно извлечь из двоичных данных MemoryStream, вызвав метод ToArray(), чтобы получить всю двоичную информацию в MemoryStream в виде массива байтов.
[XmlElement(ElementName = "Profiles")]
//public ProfilesType[] Profiles { get; set; }
public Profiles Profiles { get; set; }
Пробовал что-то выше?
Я не проверял, но это пришло в голову. Мне удалось де + сериализовать данные, которые имеют данные и т. Д. Вы не говорите о тэгах?