سؤال

في سؤال سابق حول serialising كائن إلى XmlDocument في C # ، وكنت بحاجة ل serialise بعض المعلومات خطأ لXmlDocument التي تم إرجاعها من استدعاء خدمة ويب على غرار asmx. على العميل ولست بحاجة إلى إلغاء تسلسل في XmlDocument إلى كائن.

وهذا واضح وصريح بما فيه الكفاية إذا كنت تعرف نوع، ولكن أدركت أنني أردت نهجا مرنا أين يتم ترميز أيضا في XmlDocument نوع إلى إلغاء تسلسل. أقوم به حاليا يدويا عن طريق إضافة XmlNode إلى XmlDocument الذي يحتوي على اسم نوع، وتحسب على النحو التالي:

    Type type = fault.GetType();
    string assemblyName = type.Assembly.FullName;

    // Strip off the version and culture info
    assemblyName = assemblyName.Substring(0, assemblyName.IndexOf(",")).Trim();

    string typeName = type.FullName + ", " + assemblyName;

وبعد ذلك على العميل I أولا الحصول على هذا الاسم نوع العودة من XmlDocument، وإنشاء كائن نوع التي يتم تمريرها إلى XmlSerialiser على النحو التالي:

        object fault;
        XmlNode faultNode = e.Detail.FirstChild;
        XmlNode faultTypeNode = faultNode.NextSibling;

        // The typename of the fault type is the inner xml of the first node
        string typeName = faultTypeNode.InnerXml;
        Type faultType = Type.GetType(typeName);

        // The serialised data for the fault is the second node
        using (var stream = new StringReader(faultNode.OuterXml))
        {
            var serialiser = new XmlSerializer(faultType);
            objectThatWasSerialised = serialiser.Deserialize(stream);
        }

        return (CastToType)fault;

وهكذا هذا هو نهج القوة الغاشمة، وأنا أتساءل عما اذا كان هناك حل أكثر أناقة يتضمن بطريقة أو بأخرى على TypeName من نوع تسلسل تلقائيا، بدلا من تسجيله يدويا في أي مكان آخر؟

هل كانت مفيدة؟

المحلول

وأنا واجهت مشكلة مماثلة، وخطرت لي نفس الحل. بقدر ما أشعر بالقلق، وهذا هو السبيل الوحيد للحفاظ على أنواع جنبا إلى جنب مع القيم في التسلسل XML.

وأنا أرى أنك قطع إصدار التجميع خارج كما فعلت أيضا. ولكن أود أن أذكر، أنه سيكون لديك مشاكل مع الأنواع العامة كتوقيع لهم يشبه ما يلي:

System.Nullable`1[[System.Int, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

وفصنعت وظيفة لخفض الوحيد للخروج من إصدار التجميع (ق)، والذي يبدو أن يكون كافيا للتخلص من الإصدارات المشاكل:

    private static string CutOutVersionNumbers(string fullTypeName)
    {
        string shortTypeName = fullTypeName;
        var versionIndex = shortTypeName.IndexOf("Version");
        while (versionIndex != -1)
        {
            int commaIndex = shortTypeName.IndexOf(",", versionIndex);
            shortTypeName = shortTypeName.Remove(versionIndex, commaIndex - versionIndex + 1);
            versionIndex = shortTypeName.IndexOf("Version");
        }
        return shortTypeName;
    }

نصائح أخرى

ونيل، لماذا كنت في حاجة إليها لتكون <م> نفس اكتب على كل من العميل والخادم؟

هل لا تزال تستخدم ASMX على العميل؟ ومن شأن ذلك أن يكون سببا، وASMX لا يدعم صحيح أخطاء.

وأيضا، هل لديك الكثير من أنواع مختلفة خطأ أن <م> تبديل بسيط بيان لا يمكن تحديد النوع الصحيح للاستخدام؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top