私は非常に奇妙な問題を抱えています。XML の巨大なチャンクを返す SQL Server データベースがあります。真ん中に .Net C# コードがあります。前面には 2 つのプロジェクトがあります。1 つは WCF で、もう 1 つはコンソール アプリです (テストのみ)。
コードを実行して DB から XML を取得し、コンソール アプリを使用して逆シリアル化すると、非常に高速に実行されます。しかし、WCF を介して同じコードを実行すると、XML を逆シリアル化するのに非常に時間がかかります。確かに、DB はここではボトルネックではありませんが、シリアライザーはボトルネックです。
XmlSerializer を使用しています。処理する XML 属性がたくさんあるため、DataContractSerializer に切り替えることができません。
編集:
これは、静的クラスのシリアル化コードです。
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);
上記のステートメントは、コンソール アプリと 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);
}