मेरे पास XML से ऑब्जेक्ट्स को क्रमबद्ध करने और deserializing के लिए एक मौजूदा कक्षा है। यह एक सामान्य वर्ग है जिसमें एकल प्रकार पैरामीटर T
है जिसका एकमात्र बाधा where T : IXmlSerializable
है। हालांकि, मैं अभी भी कक्षाओं पर इस कक्षा का उपयोग करने में सक्षम होना चाहता हूं जो IXmlSerializable
लागू नहीं करता है लेकिन [Serializable]
विशेषता है। मैं यह करने के बारे में कैसे जा सकता हूं?सी # जेनेरिक सीरियलाइजेशन यूटिलिटी क्लास
मेरी सामान्य वर्ग से:
public static class XmlSerializationUtils<T> where T : IXmlSerializable
{
public static T DeserializeXml(XmlDocument xml) { ... }
public static XmlDocument SerializeToXml(T toSerialize) { ... }
}
मैं this discussion पाया लेकिन कोई समाधान दिया था, सिर्फ इतना है कि मैं where T : Serializable
नहीं कर सकते। where T : SerializableAttribute
करने का प्रयास करने से विजुअल स्टूडियो का कहना है कि "सीलबंद क्लास 'सिस्टम का उपयोग नहीं कर सकता। SerializableAttribute' टाइप पैरामीटर बाधा के रूप में"।
संपादित करें: पर Stephen's answer आधारित, मैं XmlSerializationUtils<T>
पर बाधाओं को हटा दिया है और इस स्थिर निर्माता कहा:
static XmlSerializationUtils()
{
Type type = typeof(T);
bool hasAttribute = null != Attribute.GetCustomAttribute(type,
typeof(SerializableAttribute));
bool implementsInterface =
null != type.GetInterface(typeof(IXmlSerializable).FullName);
if (!hasAttribute && !implementsInterface)
{
throw new ArgumentException(
"Cannot use XmlSerializationUtils on class " + type.Name +
" because it does not have the Serializable attribute " +
" and it does not implement IXmlSerializable"
);
}
}
यह एक अनुचित समाधान नहीं है। –
हाँ, मैं सहमत हूं, इसका उपयोग ऐसे डेवलपर द्वारा किया जा रहा है, जो जानता है कि वह वर्ग जो धारावाहिक करने की कोशिश कर रहा है वह सरलीकृत है, अगर वह गलत इस्तेमाल करता है तो यह अपवाद है कि आप संकलन समय पर हर सकारात्मक बग को खत्म नहीं कर सकते हैं। –
@ बेन: हम हमेशा ऐसा नहीं कर सकते हैं, लेकिन हमें निश्चित रूप से जल्दी और अक्सर बग पकड़ने की कोशिश करनी चाहिए। इस मामले में, हम इसे संकलित समय पर नहीं पकड़ सकते हैं, लेकिन अगर हम स्थिर कन्स्ट्रक्टर चाल का उपयोग करते हैं, तो हम इसे रन टाइम की शुरुआत में पकड़ सकते हैं (जिसका मतलब है कि एक पोस्ट-कंपाइल धुआं चेक इसे याद नहीं करेगा)। –