Я создал метод, который принимает объект, затем пытается сериализовать объект в Xml, сначала используя XmlSerializer для сериализации в строку, а затем загрузите Xml обратно в объект XmlDocument для возвращаемого метода. Код выглядит так:C# XML Serialization Problem
public static XmlDocument ConvertObjectToXMLMessage(object ObjectToConvert)
{
MemoryStream stream = null;
XmlWriter writer = null;
XmlSerializer serializer = null;
XmlDocument xmlDoc = new XmlDocument();
UnicodeEncoding utf = new UnicodeEncoding();
UTF8Encoding utf8 = new UTF8Encoding();
ASCIIEncoding ascii = new ASCIIEncoding();
string result = string.Empty;
try
{
stream = new MemoryStream();
//writer = new StreamWriter(stream, Encoding.Unicode);
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
writer = XmlWriter.Create(stream, settings);
serializer = new XmlSerializer(ObjectToConvert.GetType());
serializer.Serialize(writer, ObjectToConvert);
int count = Convert.ToInt32(stream.Length);
Byte[] arr = new Byte[count];
stream.Seek(0, SeekOrigin.Begin);
stream.Read(arr, 0, count);
result = utf8.GetString(arr).Trim();
// if this is being used during a debug session, the xml will be written to the Debug Console
#if DEBUG
//blank line before
Debug.WriteLine(string.Empty);
// output result
Debug.Write(result);
//blank line after
Debug.WriteLine(string.Empty);
#endif
xmlDoc.LoadXml(result);
return xmlDoc;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (writer != null)
writer.Close();
}
}
Все работает хорошо до команды xmlDoc.LoadXml (result). Это вызывает исключение; {«Данные на корневом уровне недействительны. Строка 1, позиция 1."}
Как вы можете видеть, я объявил несколько переменных кодирования. Если я использую кодировку ASCII, она работает. Мне нужно использовать UTF8.
Любые идеи, почему это не работает? Я думаю, что это из-за ложных символов, вставленных в начале сериализации Xml. Как мне избежать этого? Типы классов, которые я мог бы сериализовать, были бы объектно-ориентированными объектами или прокси-классом, сгенерированными из XSD или WSDL.
{ «Корневой элемент отсутствует.»} – Carl
@Carl что длина потока? Просто проверьте, что он не пуст (потому что вы получите ту же ошибку). –
Тим, он не пуст. Я подумал об этом, но есть определенно содержание. – Carl