0

私は非常に奇妙な問題を抱えています。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);
}
4

1 に答える 1