当前位置: 首页 > 编程语言 > C#

C#XML序列化-前导问号分享

时间:2023-04-11 01:19:00 C#

C#XML序列化-前导问号问题利用网上找的一些例子,我写了一些XML序列化的方法。我注意到Method1中的xml字符串包含一个前导'?'.使用Method2重建对象时,这似乎没问题。但是在应用程序中进行一些测试时,有时我们会先导“???”反而。这会导致Method2在尝试重建对象时抛出异常。在这种情况下,“对象”只是一个简单的整数。System.InvalidOperationException未处理Message="XML文档(1,1)中存在错误。"Source="System.Xml"StackTrace:System.Xml在System.Xml.Serialization.XmlSerializer.Deserialize(XmlReaderxmlReader,StringencodingStyle).Serialization.XmlSerializer.Deserialize(XmlReaderxmlReader,StringencodingStyle,XmlDeserializationEvents事件)。.Serialization.XmlSerializer.Deserialize(Streamstream)atXMLSerialization.Program.Mrogram.MainatC:\DocumentsandSettings...ProjectsXMLSerialization\Program.cs:XMLSerialization.Program.DeserializeXmlStringToObject(StringxmlString,StringobjectType)online96(String[]args)atC:DocumentsandSettings...ProjectsXMLSerializationProgram.cs:line49谁能解释是什么原因造成的?示例代码这是我编写的作为VS控制台应用程序运行的迷你测试器的示例代码。它将显示XML字符串。您还可以取消对该区域的注释以附加一个额外的前导“??”重现异常。使用系统;使用System.IO;使用系统文本;使用System.Xml;使用System.Xml.Serialization;namespaceXMLSerialization{classProgram{staticvoidMain(string[]args){//反序列化为字符串#regionintobjectinObj=5;#endregion#regionstring//objectinObj="Testing123";#endregion#regionlist//ListinObj=newList();//inObj.Add("0:25");//inObj.Add("1:26");#endregionstring[]stringArray=SerializeObjectToXmlString(inObj);#region包括前导???//intindexOfBracket=stringArray[0].IndexOf('<');//stringArray[0]="??"+字符串数组[0];#endregion#region去掉前导???//intindexOfBracket=stringArray[0].IndexOf('<');//stringtrimmedString=stringArray[0].Substring(indexOfBracket);//stringArray[0]=trimmedString;#endregionConsole.WriteLine("输入");Console.WriteLine("-----");Console.WriteLine("对象类型:"+stringArray[1]);控制台.W仪式线();Console.WriteLine("XML字符串:"+Environment.NewLine+stringArray[0]);Console.WriteLine(String.Empty);//序列化回对象对象outObj=DeserializeXmlStringToObject(stringArray[0],stringArray[1]);Console.WriteLine("输出");Console.WriteLine("------");#regionintConsole.WriteLine("对象:"+(int)outObj);#endregion#region字符串//Console.WriteLine("对象:"+(string)outObj);#endregion#region列表//string[]tempArray;//列表list=(List)outObj;//foreach(列表中的字符串对)//{//tempArray=pair.Split(':');//Console.WriteLine(String.Format("Key:{0}Value:{1}",tempArray[0],tempArray[1]));//}#endregionConsole.Read();}privatestaticstring[]SerializeObjectToXmlString(objectobj){XmlTextWriterwriter=newXmlTextWriter(newMemoryStream(),Encoding.UTF8);writer.Formatting=Formatting.Indented;XmlSerializer序列化器=新XmlSerializer(obj.GetType());serializer.Serialize(writer,obj);MemoryStream流=(MemoryStream)writer.BaseStream;字符串xmlString=UTF8ByteArrayToString(stream.ToArray());stringobjectType=obj.GetType().FullName;返回新字符串[]{xmlString,objectType};}privatestaticobjectDeserializeXmlStringToObject(stringxmlString,stringobjectType){MemoryStreamstream=newMemoryStream(StringToUTF8ByteArray(xmlString));XmlSerializer序列化器=newXmlSerializer(Type.GetType);objectobj=serializer.Deserialize(stream);返回对象;}privatestaticstringUTF8ByteArrayToString(Byte[]characters){UTF8Encoding编码=newUTF8Encoding();返回编码.GetString(字符);}privatestaticbyte[]StringToUTF8BStringpXmlString){UTF8Encoding编码=newUTF8Encoding();返回编码.GetBytes(pXmlString);}}}当我以前遇到过这种情况时,它通常与编码有关。在序列化对象时,我尝试指定编码。尝试使用以下代码。另外,是否有任何特定原因需要返回string[]数组?我已经更改了使用泛型的方法,因此您不必指定类型。私有静态字符串SerializeObjectToXmlString(Tobj){XmlSerializerxmls=newXmlSerializer(typeof(T));使用(MemoryStreamms=newMemoryStream()){XmlWriterSettings设置=newXmlWriterSettings();settings.Encoding=Encoding.UTF8;设置缩进=真;settings.IndentChars="t";settings.NewLineChars=Environment.NewLine;settings.ConformanceLevel=ConformanceLevel.Document;使用(XmlWriterwriter=XmlTextWriter.Create(ms,settings)){xmls.Serialize(writer,obj);}stringxml=Encoding.UTF8.GetString(ms.ToArray());返回xml;}}privatestaticTDeserializeXmlStringToObject(stringxmlString){XmlSerializerxmls=newXmlSerializer(typeof(T));使用(MemoryStreamms=newMemoryStream(Encoding.UTF8.GetBytes(xmlString))){return(T)xmls.Deserialize(ms);如果您仍然有问题,请尝试在您看到Encoding.UTF8的代码中使用Encoding.ASCII,除非您有使用UTF8的特定原因。我不确定为什么,但在某些序列化的情况下,我看到UTF8编码导致了这个确切的问题。这是BOM符号。您可以删除它if(xmlString.Length>0&&xmlString[0]!='或使用UTF32进行序列化使用(StringWriterwriter=newStringWriter(CultureInfo.InvariantCulture)){serializer.Serialize(writer,instance);result=writer.ToString();}anddeserializeobjectresult;using(StringReaderreader=newStringReader(instance)){result=serializer.Deserialize(reader);}如果你只在.NetusingUTF32中使用这段代码,应用程序不会产生问题因为它是.Net里面所有东西的默认编码以上就是C#学习教程的全部内容:C#XML序列化-前导问号,如果对大家有用,需要详细了解C#学习教程,希望大家会多多关注---本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处: