我有一个非常奇怪的问题。我有SQL Server数据库,它返回大量的XML。在中间我有.Net C#代码。在前面我有两个项目,一个是WCF,另一个是Console应用程序(仅用于测试)。
现在,当我运行代码从DB获取XML并使用控制台应用程序对其进行反序列化时,它运行得非常快。但是当我通过WCF运行相同的代码时,需要永远地反序列化XML。我确信,DB不是这里的瓶颈,而是Serializer。
我正在使用XmlSerializer。我无法切换到DataContractSerializer,因为我有很多要处理的XML属性。
编辑:
这是静态类中的序列化代码:
public static T DeSerialize(String xml)
{
T dto = default(T);
try
{
XDocument parsedXML = XDocument.Parse(xml);
XmlSerializer serializer = new XmlSerializer(typeof(T));
serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute);
serializer.UnknownElement += new XmlElementEventHandler(serializer_UnknownElement);
serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode);
serializer.UnreferencedObject += new UnreferencedObjectEventHandler(serializer_UnreferencedObject);
if (serializer.CanDeserialize(parsedXML.CreateReader()))
{
**--This is where everything gets stuck--**
dto = (T)serializer.Deserialize(parsedXML.CreateReader());
}
}
catch (Exception ex)
{
throw;
}
return dto;
}
然后我有一个经理,让我们说使用这段代码的WorkManager:
Work work = Serialize<Work>.DeSerialize(xml);
并从Console app和WCF项目中调用上述语句。
界面是:
[OperationContract]
[WebInvoke(
Method = "POST",
RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "Work")]
XElement Work(Stream contents);
实施是:
public XElement Work(Stream contents)
{
String xml = new StreamReader(contents).ReadToEnd();
WorkManager workManager = new WorkManager();
workManager.Work(xml);
}
答案 0 :(得分:0)
一些提示:
throw;
不要两次调用CreateReader,并使用using
块:
using (var reader = parsedXML.CreateReader()) {
if (serializer.CanDeserialize(reader))
{
**--This is where everything gets stuck--**
dto = (T)serializer.Deserialize(reader);
}
}