2016-08-04 5 views
5

मैं निम्नलिखित enum परिभाषाओं ...हल करने के लिए कैसे करें "दोनों एक्सएमएल प्रकार नाम एक्स का उपयोग करते हैं, एक्सएमएल विशेषताओं का उपयोग इस प्रकार के लिए एक अद्वितीय एक्सएमएल नाम और/या नेमस्पेस निर्दिष्ट करने के लिए करते हैं?

namespace ItemTable 
{ 
    public enum DisplayMode 
    { 
    Tiles, 
    Default 
    } 
} 

namespace EffectiveItemPermissionTable 
{ 
    public enum DisplayMode 
    { 
    Tree, 
    FullPaths 
    } 
} 

... और फिर मैं निम्नलिखित वर्गों है ...

public class Table<TDisplayMode> 
    where TDisplayMode: struct 
{ 
    // public 
    public TDisplayMode DisplayMode 
    { 
     get { return mDisplayMode; } 
     set { mDisplayMode = value; } 
    } 

    // private 
    private TDisplayMode mDisplayMode; 
} 

public class ItemTable : Table<ItemTable.DisplayMode> 
{} 

public class EffectiveItemPermissionTable : Table<EffectiveItemPermissionTable.DisplayMode> 
{} 

public class UISettings 
{ 
    public UISettings() 
    { 
    ItemTable = new ItemTable(); 
    EffectiveItemPermissionTable = new EffectiveItemPermissionTable(); 
    } 

    public ItemTable ItemTable { get; set; } 
    public EffectiveItemPermissionTable EffectiveItemPermissionTable { get; set; } 
} 

... और जब मैं का एक उदाहरण क्रमानुसार करने की कोशिश साथ ... UISettings

System.Xml.Serialization.XmlSerializer lSerializer = 
    new System.Xml.Serialization.XmlSerializer(typeof(UISettings)); 

... मैं निम्नलिखित त्रुटि मिलती है:

Types 'UISettings.Table`1[EffectiveItemPermissionTable.DisplayMode]' and 
'UISettings.Table`1[ItemTable.DisplayMode]' both use the XML type name, 
'TableOfDisplayMode', from namespace ''. 

Use XML attributes to specify a unique XML name and/or namespace for the type. 

मैंने XmlType attribubtes और वेब पर पोस्ट किए गए सभी प्रकार के समाधानों का उपयोग करने का प्रयास किया है लेकिन कुछ भी काम नहीं करता है। त्रुटि में उल्लिखित XML प्रकार का नाम हमेशा TableOfDisplayMode होता है।

अभी एकमात्र समाधान नामों में से एक का नाम बदलना है, उदा। DisplayMode_ पर, लेकिन मुझे बदसूरत लगता है।

public class UISettings 
{ 
    public UISettings() 
    { 

     ItemTable = new ItemTable(); 
     EffectiveItemPermissionTable = new EffectiveItemPermissionTable(); 
    } 
    [XmlElement(Namespace = "Item")] 
    public ItemTable ItemTable { get; set; } 
    [XmlElement(Namespace = "Permissions")] 
    public EffectiveItemPermissionTable EffectiveItemPermissionTable { get; set; } 
} 

जब यहां लागू किया यह आपके धारावाहिक उत्पादन होगा::

उत्तर

5

आप अपने UISettings वर्ग के गुणों पर XmlElement विशेषता का उपयोग करके Namespace उपलब्ध कराने की आवश्यकता वैकल्पिक रूप से

<?xml version="1.0" encoding="utf-16"?> 
<UISettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ItemTable xmlns="Item">  
     <DisplayMode>Tiles</DisplayMode> 
    </ItemTable> 
    <EffectiveItemPermissionTable xmlns="Permissions">  
     <DisplayMode>FullPaths</DisplayMode> 
    </EffectiveItemPermissionTable> 
</UISettings> 

, और शायद क्लीनर, आप नामों पर नामस्थान प्रदान कर सकते हैं:

[XmlType(Namespace="Item")] 
public class ItemTable : Table<ItemTableNS.DisplayMode> 
{ } 

[XmlType(Namespace = "Permission")] 
public class EffectiveItemPermissionTable : Table<EffectiveItemPermissionTableNS.DisplayMode> 
{ } 

के रूप में यह क्रमानुसार देगा:

<?xml version="1.0" encoding="utf-16"?> 
<UISettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ItemTable> 
    <DisplayMode xmlns="Item">Tiles</DisplayMode> 
    </ItemTable> 
    <EffectiveItemPermissionTable> 
    <DisplayMode xmlns="Permission">FullPaths</DisplayMode> 
    </EffectiveItemPermissionTable> 
</UISettings> 
+0

ओह मेरा ... काम करता है! धन्यवाद। लेकिन मुझे नामस्थान निर्दिष्ट करने की आवश्यकता क्यों है? सीरिएलाइज़र सिर्फ संपत्ति नाम का नामस्थान के रूप में क्यों उपयोग नहीं करता है? – ViRuSTriNiTy

+1

खैर, धारावाहिक डिफ़ॉल्ट रूप से नेमस्पेस का उपयोग नहीं करता है और जब आवश्यक हो तो उन्हें उत्पन्न करना अधिक परिदृश्य को तोड़ देगा। नेमस्पेस उस अर्थ में सी # में नेमस्पेस के समान हैं। इससे कोई फर्क नहीं पड़ता कि 'लेबल' सिस्टम से आ रहा है। Windows.Forms या System.Web.WebControls नामस्थान। – rene

+0

ठीक है, लेकिन डिस्प्लेमोड नोड्स में 'xmlns' विशेषता जोड़ने के लिए भी क्यों आवश्यक है? कोई विशिष्ट कारण? – ViRuSTriNiTy

1

मुझे पता है इस सवाल का जवाब शायद ओपी के लिए बहुत देर हो चुकी तरह से आता है, लेकिन वहाँ नामस्थान का उपयोग किए बिना यह करने के लिए एक तरीका है, इसलिए मैं यहाँ एक जवाब छोड़ने के लिए जा रहा हूँ अगर कोई मेरे पीछे आता है और समाधान की आवश्यकता है।

समस्या इस तथ्य के कारण होती है कि XmlSerializer नाम X<Y> नाम XOfY नाम दे रहा है। इस प्रकार, जब आपके पास दो प्रकार होते हैं जो Table<TDisplayMode> से प्राप्त होते हैं, तो आपको वह त्रुटि मिलती है, क्योंकि वे वास्तव में विभिन्न enums का उपयोग करने के बावजूद आंतरिक रूप से TableOfDisplayMode के रूप में ज्ञात होंगे।

इसका कारण यह है ItemTable और EffectiveItemPermissionTable वास्तव में नहीं एक ही प्रकार से इनहेरिट कर रहे हैं! एक को Table<ItemTable.DisplayMode> और दूसरा Table<EffectiveItemPermissionTable.DisplayMode> से विरासत में मिला है। यह नहीं कि यह विरासत तक ही सीमित है; यदि आप उन्हें उसी XML ऑब्जेक्ट ग्राफ़ में सीधे उपयोग करने का प्रयास करते हैं तो आपको एक ही समस्या का सामना करना पड़ेगा।

अब, इस समस्या के गैर-जेनेरिक समकक्ष के लिए, आप दो प्रकारों पर [XmlType] को स्मैक करेंगे और इसे एक दिन कॉल करेंगे। लेकिन आप इसे यहां नहीं कर सकते हैं। जबकि Table<ItemTable.DisplayMode> और Table<EffectiveItemPermissionTable.DisplayMode> विभिन्न प्रकार हैं, वे समान श्रेणी परिभाषा साझा करते हैं, इसलिए [XmlType] का उपयोग करने का प्रयास करके, आप उन्हें एक अलग नाम दे रहे हैं, लेकिन फिर भी वही नाम दे रहे हैं।

तो आप क्या कर सकते हैं? बचाव के लिए XmlAttributeOverrides!यह जिसका अर्थ है कि आप अंत में Table<ItemTable.DisplayMode> और Table<EffectiveItemPermissionTable.DisplayMode> के लिए एक अलग नाम दे सकते हैं, तो आप बंद सामान्य प्रकार के नामों XmlSerializer देता ओवरराइड करने देता है:

var xmlOverrides = new XmlAttributeOverrides(); 

var xmlAttribs = new XmlAttributes(); 
xmlAttribs.XmlType = new XmlTypeAttribute("TableOfItemTableDisplayMode"); 
xmlOverrides.Add(typeof(Table<ItemTable.DisplayMode>), xmlAttribs); 

xmlAttribs = new XmlAttributes(); 
xmlAttribs.XmlType = new XmlTypeAttribute("TableOfEffectiveItemPermissionTableDisplayMode"); 
xmlOverrides.Add(typeof(Table<EffectiveItemPermissionTable.DisplayMode>), xmlAttribs); 

System.Xml.Serialization.XmlSerializer lSerializer = 
    new System.Xml.Serialization.XmlSerializer(typeof(UISettings), xmlOverrides); 

और देखा! अब मान लें कि आपने [XmlType] को अपने DisplayMode एनम्स के लिए अलग-अलग नामों के साथ भी रखा है, ताकि उनके नाम किसी भी तरह से संघर्ष न करें, तो आप स्वयं को एक कार्य सेटअप प्राप्त कर चुके हैं!

संबंधित मुद्दे

 संबंधित मुद्दे